MYSQL中in的用法


工作原理

   以如下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表數據量小的情況,並且是從緩存中取數據。


免責聲明!

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



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