这是我的第一个问题在SO查询来进行微调
我使用的查询是::
SELECT column1, column2, COUNT(*)
FROM myTable
GROUP BY DATE(logged_date)
HAVING COUNT(*)>10
MYTABLE contaings两亿条记录,并且列logged_date是datetime类型。
上面的查询是在15分钟内执行的。
任何帮助将不胜感激。
这是我的第一个问题在SO查询来进行微调
我使用的查询是::
SELECT column1, column2, COUNT(*)
FROM myTable
GROUP BY DATE(logged_date)
HAVING COUNT(*)>10
MYTABLE contaings两亿条记录,并且列logged_date是datetime类型。
上面的查询是在15分钟内执行的。
任何帮助将不胜感激。
欢迎光临。 最好也提供表格模式。不过,我会猜一猜:
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。我建议你看看这个。
我也担心在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
将'column1,column2'添加到'GROUP BY'子句可能会完全改变输出。只有在两者都直接依赖'ldate'时才应该这样做。 – 2012-07-15 09:18:10
如果不存在,则将索引添加到'logged_date'。并检查'解释选择列1 ...'输出 – 2012-07-15 06:34:42
添加更多信息到您的问题。是否被logged_date编入索引?什么是执行计划?你有没有尝试过? – Andre 2012-07-15 06:36:16
@juergend:感谢您的回复,但logged_date列已编入索引 – 2012-07-15 06:37:03