in的對象選擇(子查詢還是List集合),in 的優化,in與exists


近日查看SQL慢查詢日志,發現對於in的查詢總是出現超時問題。超時相關SQL語句:select * from flow_ru_bizvar where businessId IN () and status = 0。可以看到在這句SQL中,最耗時的就是因為in的原因。這里in的對象是一個Long類型(businessId)的List。先是從另一個表中,select出相關的businessId,然后再根據這些businessId進行查詢。這樣做的目的是為了避免表鏈接而帶來的耗時,然而,從結果來看這樣的處理結果還是耗時的。所以,關於這兩個種方式究竟那種較好,以及各自的使用條件,如何對其兩種進行優化。

1.當是集合時,in的處理機制:

 

2.當是子查詢時,in的處理機制:

          首先執行子查詢,其查詢出來的結果作為衍生表(臨時表),同時,其原有的索引仍然會起作用。

 

3.in與exists的區別以及使用條件

         exists使用主查詢中的表作為驅動表,適用於子查詢中的表有索引支持,主查詢中的表數據較少時的情況。exists 對主表進行loop,根據主表的值去查看子表的結果(子表的結果為true或false),若子表的結果為true,則返回主表的結果,否則不返回主表的結果。

        

        in使用子查詢中的表作為驅動表,適用於主查詢中的表有索引支持,子查詢中的表數據較少時的情況。其執行流程,將主查詢的結果集與子查詢的結果集進行內鏈接。

測試語句:

explain select *
from flow_ru_business
where flow_ru_business.businessId in (select gte_order.businessId from gte_order where gte_order.status = 7);

主查詢使用遍歷全表而不是遍歷索引的原因是:主查詢要求返回出所有元素字段,只能查表,如果滿足覆蓋索引才會遍歷索引而不是表。

 


免責聲明!

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



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