2012-07-15 49 views
1

这是我的第一个问题在SO查询来进行微调

我使用的查询是::

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

MYTABLE contaings两亿条记录,并且列logged_date是datetime类型。

上面的查询是在15分钟内执行的。

任何帮助将不胜感激。

+0

如果不存在,则将索引添加到'logged_date'。并检查'解释选择列1 ...'输出 – 2012-07-15 06:34:42

+0

添加更多信息到您的问题。是否被logged_date编入索引?什么是执行计划?你有没有尝试过? – Andre 2012-07-15 06:36:16

+0

@juergend:感谢您的回复,但logged_date列已编入索引 – 2012-07-15 06:37:03

回答

2

欢迎光临。 最好也提供表格模式。不过,我会猜一猜:

logged_date是一个TIMESTAMP列或一个DATATIME - 是这样吗?这是在该列上执行DATE()的原因。

你最好的选择,如果这是你希望优化查询,是添加另一个列,这是logged_date_day(名字已经是混乱的,第二个之多:))

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

然后,您需要为新列编制索引,并在该列上执行GROUP BY

PS

从技术上讲,SELECT column1 FROM some_table GROUP BY another_column是不是有效的查询。 MySQL允许它在您的sql_mode不包含ONLY_FULL_GROUP_BY。我建议你看看这个。

0

我也担心在logged_date分组但显示列1和2,这可能不会得到预期的结果,所以最好组上所有的cols或使用像最大的功能或周围COLUMN1闵和2

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

使组确保一切由是togther键:

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 
+0

将'column1,column2'添加到'GROUP BY'子句可能会完全改变输出。只有在两者都直接依赖'ldate'时才应该这样做。 – 2012-07-15 09:18:10