我想根據uniqueEntries中不存在的actualEntries用戶標識將actualEntries表中的所有記錄插入到uniqueEntries表中。通過一個LEFT JOIN優化SQL子查詢
我從一個包含NOT IN
子查詢的SQL子句開始,這個子查詢非常緩慢(在400K記錄上運行時),並將其變爲LEFT JOIN
子句,但速度沒有提高。
以下是包含NOT IN
子查詢我原來的SQL子句:
INSERT INTO uniqueEntries
SELECT *
FROM actualEntries
WHERE actualEntries.User_ID NOT IN (
SELECT uniqueEntries.User_ID
FROM uniqueEntries
)
GROUP BY User_ID"
以下是被轉換成後的SQL子句LEFT JOIN
:
INSERT INTO uniqueEntries
SELECT actualEntries.*
FROM actualEntries
LEFT JOIN uniqueEntries
ON uniqueEntries.User_ID = actualEntries.User_ID
WHERE uniqueEntries.User_ID IS NULL
GROUP BY User_ID
當我運行50個記錄都querys他們馬上完成,但是當我在400K記錄上運行它們時,它們沒有完成。
完成此操作最快捷的方法是什麼?
UPDATE /溶液: 作爲每@Rahul,@Steve E和@fhthiella我更新了LEFT JOIN如下,並且處理時間減少到2分鐘470K記錄。所有的
INSERT INTO uniqueEntries
SELECT actualEntries.*
FROM actualEntries
LEFT JOIN uniqueEntries
ON uniqueEntries.id = actualEntries.id
WHERE uniqueEntries.User_ID IS NULL GROUP BY User_ID
我將uniqueEntries上的.User_ID和actualEntries更改爲.id(即有效)。 我確實需要GROUP BY,因爲有些條目是重複的,我只想要唯一條目 – xited
@xited,但我相信你不需要'GROUP BY'導致where語句'WHERE uniqueEntries.User_ID IS NULL'會做你自己話說。 – Rahul
@Rahul不完全http://sqlfiddle.com/#!9/096ed8/1在這個上下文中,group by仍然是需要的(或者更好地使用主鍵,然後使用INSERT IGNORE http://sqlfiddle.com/ #!9/e3131/1 – fthiella