MySQL NOT IN用LEFT JOIN優化
知識
01-04
項目中有一個需求,B表會從A表中選一些數據進來。那麼在選擇的時候,就要查詢出:A表中狀態為啟用(1),且不包含B表已選中的數據。
假設A表有ID為1-20的數據,B已經選了1,2,19,查詢的時候就必須排除這三條數據。
首先的想法如下:
SELECT * FROM tab_a WHERE id NOT IN (:ids) AND status = 1;
ids為B表已選中的ID集。
因為NOT IN是不走索引的,所以這種寫法很不好,數據量小的話還湊合,一旦大起來就不行了。
優化的方案採用LEFT JOIN:
SELECT a.* FROM tab_a AS a LEFT JOIN (SELECT * FROM tab_a WHERE id IN (:ids)) AS b ON a.id=b.id WHERE b.id IS NULL AND a.status=1;
打開今日頭條,查看更多圖片


TAG:Java個人學習心得 |