in多值優化


〇、問題
今天ocp群里有人問
SELECT *
FROM table
WHERE id IN(11,2,3,44,...)
在in里面有大量數據4000+,有什么 好的處理方式嗎?
我的優化方案的總體思路是把in轉換成表連接,其中in中多值轉換成一列的結果集,類似臨時表功能
僅僅以MySQL和Java舉例,其他數據庫和開發語言也有類似的實現
1、目標
總體來說大概就是弄出來sql要這樣
SELECT a.*
FROM table a
INNER JOIN (
  SELECT 11 id
  UNION ALL SELECT 2
  UNION ALL SELECT 3
  UNION ALL SELECT 44
  #其他的省略
) t ON a.id = t.id
2、代碼
mybatis代碼為
INNER JOIN (
  <foreach collection="list" item="item" index="index" separator="UNION ALL" >
    SELECT #{item} id
  </foreach>
)t ON a.id = t.id
入參為parameterType="java.util.List"
這樣就可以把in轉換成mysql的表連接。
3、參數分裂
如果有sql過長的錯誤。就減少一次傳入的list中id個數。
例如1000個一組查一次。然后在java中合並list
方法是java.util.Listboolean addAll(Collection<? extends E> c);
其他類似多參數in行構造器查詢時。也可以使用類似方法優化。該方法可以使用到in的關系鍵是多列的情況


免責聲明!

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



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