【mysql】關聯子查詢的一種最佳化

來源:互聯網
上載者:User
很多時候,在mysql上實現的子查詢的效能較差,這聽起來實在有點難過。特別有時候,用到IN()子查詢語句時,對於上了某種數量級的表來說,耗時多的難以估計。本人mysql知識所涉不深,只能慢慢摸透箇中玄機了。
假設有這樣的一個exists查詢語句:
select * from table1

where exists     (select * from table2 where id>=30000 and table1.uuid=table2.uuid);
table1為十萬行級的表,table2為百萬行級的表,本機測試結果用時2.40s。
通過explain可以看到子查詢是一個相互關聯的子查詢(DEPENDENCE SUBQUERY); Mysql會首先對外表table1進行全表掃描,然後根據返回的uuid逐次執行子查詢。如果外層表是一個很大的表,我們可以想象查詢效能會表現得比此次測試更糟糕。一種簡單的最佳化方案為 使用inner join的方法來代替子查詢, 查詢語句則可以改為:
select * from table1 innner join table2 using(uuid) where table2.id>=30000;
本機測試結果用時0.68s。
通過explain可以看到mysql使用了SIMPLE類型(子查詢或union以外的查詢方式); Mysql最佳化器會先過濾table2,然後對table1和table2做笛卡爾積得出結果集後,再通過on條件來過濾資料。當然了,並不是所有情況下關聯子查詢的效能都會差;具體效果需要進行實際的測試才能得出結果。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.