現在有兩個表,table1和table2,table1有1千萬數據(id 主鍵索引),table2有三條數據(uid字段 3,5,7);
select * from table1 where id in ( select uid from table2 );
眨眼一看感覺這條語句應該很快;可能你會一廂情願的以為 先執行括號里面的語句,然后在執行外層的select;外層的select用上了 id主鍵速度應該飛起來才對;
實際上這條語句執行非常慢,我這里測試20s;
通過 explain 分析,這條語句沒有用上索引,而是全表掃描;原因在哪里?
實際上 mysql 內部不是照着我們的想法來運行的,他是從外層執行起走,每掃一行就把id拿來和內層查詢比較,所以外層是全表掃描;
把這條語句改成:
select * from table1 where id in ( 3,5,7 ); 【補充一點,在mysql內部 in 會被自動轉化為 exists】
執行時間編程毫秒級了,通過explain 查看 使用了range 掃描,可以看出mysql內部操作原理;
然后我們再來看一下有沒有解決方案:
select table1.* from table1 inner join table2 on table1.id=table2.uid;
查詢時間也是毫秒級的;
這次通過 explain 發現 ,mysql先執行了 select uid from table2,然后執行select table1 並且使用了 eq_ref 一對一索引;