MySQL 查詢 select * from table where id in 如何提高效率?

例句:select * from a where id in (select id from b );

對於這條sql語句它的執行計劃其實並不是先查詢出b表的所有id,然後再與a表的id進行比較。
mysql會把in子查詢轉換成exists相關子查詢,所以它實際等同於這條sql語句:select * from a where exists(select * from b where b.id=a.id );

而exists相關子查詢的執行原理是: 循環取出a表的每一條記錄與b表進行比較,比較的條件是a.id=b.id . 看a表的每條記錄的id是否在b表存在,如果存在就行返回a表的這條記錄。

exists查詢有什麼弊端?
由exists執行原理可知,a表(外表)使用不了索引,必須全表掃描,因爲是拿a表的數據到b表查。而且必須得使用a表的數據到b表中查(外表到裏表中),順序是固定死的。

如何優化?
把查詢修改成inner join連接查詢:select * from a inner join b on a.id=b.id; 


可用EXPLAIN EXTENDED或者DESC來查看SQL執行計劃來分析,下面是實際優化SQL,字段和表名做了處理

優化前

SELECT a.good_num, a.cal_date, a.count,a.apply_date, a.name, a.class_num
FROM table1 
where id in (
SELECT max(id) id
FROM table1 
where name = '金屬製品有限公司' GROUP BY num
)


優化後
SELECT a.good_num, a.cal_date, a.count,a.apply_date, a.name, a.class_num
FROM table1 a 
inner join 
( SELECT max(id) id
  FROM table1
  where name = '金屬製品有限公司' GROUP BY num ) b
on a.id=b.id
where a.count >= 10000


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章