MySQL 的 in 查詢在 5.5 以上的版本中存儲引擎都是 innodb 的,正常情況下會走索引的!至於 MyISAM 沒試過!
如果是 5.5 之前的版本確實不會走索引的,在 5.5 之后的版本,MySQL 做了優化。MySQL 在 2010 年發布 5.5 版本中,優化器對 in 操作符可以自動完成優化,針對建立了索引的列可以使用索引,沒有索引的列還是會走全表掃描。
5.5 之前的版本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 表的這條記錄。
