我正在尝试优化以下查询,因为它需要很长时间才能执行。任何人都可以提供有关如何优化这一点的任何建议,他们可以推荐任何可以加快它的索引。作为注释,edata表包含大约100万行,ddata表有大约1500万行。如果您运行查询,则从ddata中选择大约5,000个项目
SELECT * FROM ddata WHERE DATE(startDate) = DATE(NOW());
我想要优化的查询是:
SELECT e.ID,e.uID,e.sID
FROM edata e
LEFT JOIN ddata d ON e.sID=d.sID
WHERE DATE(d.startDate)=DATE(NOW());
由于
答案 0 :(得分:3)
#1:您可能不需要外部联接,因此将其替换为内部联接(已知MySQL的优化程序很难确定是否可以将外部联接重写为内部联接)。
#2:删除d.startDate上的函数。
SELECT e.ID,e.uID,e.sID
FROM edata e
JOIN ddata d ON e.sID=d.sID
WHERE d.startDate >= DATE(NOW())
AND d.StartDate < date_add(DATE(NOW(), interval 1 days);
答案 1 :(得分:0)
特别是对于此查询,在联接之前放置where子句,这将显着减少执行时间。 其次,当你只选择左表的列时,为什么要使用LEFT OUTER JOIN?这完全违背了LEFT JOIN的目的。所以简单的连接就可以了。
SELECT e.ID,e.uID,e.sID
FROM edata e,
(select * from ddata
WHERE DATE(startDate)=DATE(NOW()
) d
WHERE e.sID=d.sID;
通常,使用EXPLAIN statement更好地了解和优化您的查询。如果您在DBMS中完成基本的优化,那么您也可以使用其他技术,例如索引。