查询需要微调

时间:2012-07-15 06:30:17

标签: mysql sql performance

这是我在SO中的第一个问题

我正在使用::

的查询
SELECT   column1, column2, COUNT(*) 
FROM     myTable 
GROUP BY DATE(logged_date) 
HAVING   COUNT(*)>10

Mytable包含200万条记录,而logged_date列的类型为datetime。

以上查询执行时间为15秒。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

欢迎。 最好还提供表模式。不过,我会做一些猜测:

logged_date是TIMESTAMP列还是DATATIME - 是这样的吗?在该列上执行DATE()的原因是什么。

您最好的选择,如果这是您要优化的查询,则添加另一个列,logged_date_day(第一个名称已经令人困惑,第二个名称已经过多了: ))

这意味着同时支持两者(但我的下一个猜测是你只有INSERT一个,而不是再次更新 - 所以这不是太费力。)

然后,您必须为新列编制索引,并对该列执行GROUP BY

PS

从技术上讲,SELECT column1 FROM some_table GROUP BY another_column不是有效的查询。当 sql_mode 不包含ONLY_FULL_GROUP_BY时,MySQL允许它。我建议你研究一下。

答案 1 :(得分:0)

我也担心在logged_date上进行分组,但是显示了column1和2,这可能不会给你预期的结果,所以最好在所有cols上分组,或者在column1和2周围使用max或min等函数

不过,你可能会考虑这样的事情:

确保群组中的所有内容都与以下内容相关联:

alter table myTable add key (logged_date (10), column1,column2);

更改了查询:

SELECT   left(logged_date,10) as ldate , column1, column2, COUNT(*) 
FROM     myTable 
GROUP BY ldate,column1,column2 
HAVING   COUNT(*)>10