mysql in型子查詢陷阱

來源:互聯網
上載者:User

標籤:explain   color   掃描   range   style   想法   ref   資料   索引   

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

mysql in型子查詢陷阱

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.