如何优化大型表的MySQL查询

时间:2014-02-09 18:37:23

标签: mysql sql optimization

我正在尝试优化以下查询,因为它需要很长时间才能执行。任何人都可以提供有关如何优化这一点的任何建议,他们可以推荐任何可以加快它的索引。作为注释,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());

由于

2 个答案:

答案 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中完成基本的优化,那么您也可以使用其他技术,例如索引。