这是我在SO中的第一个问题
我正在使用::
的查询SELECT column1, column2, COUNT(*)
FROM myTable
GROUP BY DATE(logged_date)
HAVING COUNT(*)>10
Mytable包含200万条记录,而logged_date列的类型为datetime。
以上查询执行时间为15秒。
任何帮助将不胜感激。
答案 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