code

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 的語法來做!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *