1. 程式人生 > >Mysql-left join 遇到的問題記錄

Mysql-left join 遇到的問題記錄

問題描述:

A表主鍵為key,A表記錄2w條。

B表主鍵為key,B表記錄1w條。

要求A表和B進行左外連結,查詢A表所有記錄,在B表沒有對應記錄的列設為null。

很明顯使用A left join B就能滿足需求

但是,問題是:

select * from A a left join B b on a.key = b.key;

在使用正常的查詢的時候發現查詢效率很低,需要大約70秒左右。

使用:

explain select * from A a left join B b on a.key = b.key;

顯示執行計劃發現並查詢並沒有走索引,查詢量差不多就是2w*1w的笛卡爾積了。但是明明是使用key作為主鍵進行查詢了啊,為什麼不行呢?

查詢了很多資料,也搜了很多優化條件,大多數說的都是儘量讓條件使用索引,體檢減小驅動表得到大小等方法,但是貌似都不管用。

後來仔細查看了下A表和B表的表結構,發現A表的索引key是int型別,但是B表的索引key是varchar型別!!!!!

這才是導致問題慢的主要原因,通過轉換型別重新查詢,發現查詢時間從70s+降到1s以內。

總結:

在做表結構設計的時候,主鍵索引的欄位型別一定要一樣,名字可以不一樣,但是欄位型別一定要一樣,不然非常影響查詢效率。