〇、問題
今天ocp羣裏有人問
SELECT *
FROM table
WHERE id IN(11,2,3,44,...)
在in裏面有大量數據4000+,有什麼 好的處理方式嗎?
個人優化方案的整體思路是把in轉換成錶鏈接,其中in中多值轉換成一列的結果集,相似臨時表功能
僅僅以MySQL和Java舉例,其餘數據庫和開發語言也有相似的實現
一、目標
整體來講大概就是弄出來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
二、代碼
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的錶鏈接。
三、參數分裂
若是有sql過長的錯誤。就減小一次傳入的list中id個數。
例如1000個一組查一次。而後在java中合併list
方法是java.util.List
的boolean addAll(Collection<? extends E> c);
其餘相似多參數in行構造器查詢時。也能夠使用相似方法優化。該方法能夠使用到in的關係鍵是多列的狀況
java