2014-02-09 53 views
0

我想优化以下查询,因为它需要很长时间才能执行。任何人都可以提供关于如何优化这个建议,并且他们可以推荐任何索引来加速它。作为说明,edata表包含大约100万行,ddata表大约有1500万行。有来自DDATA选择,如果你运行查询约5000项如何优化大型表的MySQL查询

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

索引的基本经验法则:在比较操作中使用的任何字段都应该有一个索引。那就是你的'where','join',有时'order'子句中使用的任何东西。请注意,如果您在比较中使用该字段的DERIVED值,就像使用DATE()调用一样,在字段上使用索引是没有用的。 'startDate'可能被索引,但是'md5(somefield)'会强制执行表扫描。 –

+0

可能作为旁白,使用NOW()意味着查询不会进入查询缓存 - 如果您预先填充了字符串,那么重复运行会更快。 –

+0

我会运行EXPLAIN语句https://dev.mysql.com/doc/refman/5.0/en/explain.html向您显示有关查询的信息。你可以发布结果,以便我们可以给出相关答案。 – Tommassiov

回答

0

专门针对此查询,放哪里在连接之前,这将显着减少执行时间。 其次,为什么只在选择左表的列时使用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中进行优化的基础知识,那么你也可以应用其他技术,如索引。

+0

加入“d”是没有意义的,因为它从未在选择列表中使用过。 – jbaliuka

+0

但它用于连接条件。嵌套查询需要一个别名。所以这是必要的。 –

+0

“SELECT e.ID,e.uID,e.sID FROM edata e”应该返回相同的结果 – jbaliuka

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);