java – 查詢速度很慢!IN 改為 JOIN/EXIST 效能衝上天!
最近遇到查詢很慢的問題
網路上有大量的資料說將 IN 改成 JOIN 或者 exist,然後修改完成之後確實變快了
就來看看要怎麼做!
IN 改為 JOIN/EXIST
例如有如下的 IN 查詢:
SELECT * FROM table1
WHERE table1.id IN ( SELECT id FROM table2 )
如果子查詢select id from table2
資料量比較大的情況下,則會很慢,網路上往往是建議修改為:
SELECT * FROM table1 WHERE EXISTS ( SELECT 1 FROM table2 WHERE table1.id = table2.id )
或者改成 INNER JOIN 形式:
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
NOT IN 改成 NOT EXIST/LEFT JOIN
例如有如下的 NOT IN 查詢:
SELECT * FROM table1 WHERE id NOT IN ( SELECT id FROM table2 )
改成 NOT EXISTS 語法:
SELECT * FROM table1 WHERE NOT EXISTS ( SELECT 1 FROM table2 WHERE table1.id = table2.id )
改成 LEFT JOIN 語法:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id WHERE table2.id IS NOT NULL
整體上來說修改都快了很多!
但是用 JOIN 上會比 EXISTS 在快上一點!
所以如果在效能上還是推薦使用 JOIN 的語法來做!