工作原理
以如下SQL為例,分析in在嵌套查詢語句中的工作原理:
SELECT * FROM A WHERE id IN (SELECT id FROM B);)
等價於:
- SELECT id FROM B ----->先執行in中的查詢,並且緩存結果集;
- SELECT * FROM A WHERE A.id = B.id。
工作原理:緩存B中查詢出來的id,A表查詢時把A表的id與緩存數據比較,滿足條件的數據加入結果集。
以上SQL語句中,in中的子查詢語句僅僅執行一次,它查詢出B中的所有的id並緩存起來,然后檢查A表中的id在緩存中是否存在,如果存在則將A的當前記錄加入到結果集中,直到遍歷完A表中所有記錄為止。
適用場景
從內外表數據量的大小視角剖析,B表數據比A表數據小,B表符合要求的數據都被緩存起來,A中每查詢一次就與緩存中的數據比較一次。以下用遍歷結果集的方式來分析IN查詢:
private void search() { List result = new ArrayList(); //結果集
String A[] = {"select * from A"}; // 存儲從A表查詢到的結果集
String B[] = {"select * from B"}; // 存儲從B表查詢到的結果集
for (String bValue : B) { for (String aValue : A) { if (aValue.equals(bValue)) { result.add(aValue); break; } } } System.out.println(result); }
通過以上Java偽代碼可以看出,當B表的數據較大時不適合使用in查詢,因為它會遍歷B表中的全部記錄。
案例分析
1、A表中有100條記錄,B表中有1000條記錄,那么最多可能遍歷1000*100次,效率很差;
2、A表中有1000條記錄,B表中有100條記錄,那么最多可遍歷100*1000此,內循環次數減少,效率大大提升。
小結
IN查詢適合B表數據量比A表數據量小的情況,並且是從緩存中取數據。