近日查看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);
主查詢使用遍歷全表而不是遍歷索引的原因是:主查詢要求返回出所有元素字段,只能查表,如果滿足覆蓋索引才會遍歷索引而不是表。

