2015-10-09 43 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