2015-10-09 57 views
1

我想選擇一些項目從表1 不在表2表1約有3百萬行,表2約有8,000。我已經有表1(過期,不可靠,阻止,刪除,標誌,expirationDate)的索引。我該如何優化:如何優化左連接查詢的大表

SELECT table1.* 
FROM table1 
LEFT JOIN table2 
ON table1.item_ID = table2.item_ID 
WHERE table1.expire = '0' 
AND table1.unreliable = '0' 
AND table1.block = '0' 
AND table1.deleted = '0' 
AND table1.flag = '0' 
AND table1.expirationDate >= CURDATE() 
AND table2.item_ID IS NULL 
GROUP BY item_ID 
LIMIT 5000 

回答

2

添加額外索引table2.item_id。這個指數對優化LEFT JOIN很重要。

想象一下,你有兩個不同的電話簿。您正在搜索A書中以「T」(WHERE部分)開頭的所有人。由於您有索引,因此速度非常快。但是,對於每個電話號碼,您必須掃描全書B,試圖在那裏找到相同的電話號碼。使用索引(書B中所有電話號碼的排序列表),這是更快...

+0

但不應該這些索引存在,因爲item_ID是兩個表中的主鍵? – user2694306

+0

你沒有說'item_ID'是你的主鍵。我不確定mysql是否會自動爲主鍵創建索引。我相信要記住,情況並非如此。你可以簡單地使用'SHOW INDEX'來檢查。如果它不顯示這樣的索引,它不存在。 –

+1

啊,你是對的,它不是第二張表中的主鍵。現在它似乎運作良好。謝謝! – user2694306