MySQL in型子查詢陷阱


現在有兩個表,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 一對一索引;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM