Mysql 需要微调的查询

Mysql 需要微调的查询,mysql,sql,performance,Mysql,Sql,Performance,这是我在SO中的第一个问题 我使用的查询是:: SELECT column1, column2, COUNT(*) FROM myTable GROUP BY DATE(logged_date) HAVING COUNT(*)>10 Mytable包含200万条记录,logged_date列的类型为datetime 上面的查询大约需要15秒才能执行 任何帮助都将不胜感激。欢迎。 最好还提供表模式。不过,我会作出一些猜测: 记录的日期是时间戳列还是数据时间-是这样吗?

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

我使用的查询是::

SELECT   column1, column2, COUNT(*) 
FROM     myTable 
GROUP BY DATE(logged_date) 
HAVING   COUNT(*)>10
Mytable包含200万条记录,logged_date列的类型为datetime

上面的查询大约需要15秒才能执行

任何帮助都将不胜感激。

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

记录的日期是时间戳列还是数据时间-是这样吗?这就是为什么要在该列中添加日期

如果这是一个您希望优化的查询,您最好的选择是添加另一列,该列被记录为\u date\u day。第一个名称已经令人困惑,第二个名称同样令人困惑:

这意味着同时支持两者,但我的下一个猜测是,您只插入一个,不需要再次更新-因此这不是太多的努力

然后,您必须为新列编制索引,并对该列进行分组

PS


从技术上讲,通过另一列从某个\u表组中选择column1不是有效的查询。当您的sql_模式不包含时,MySQL允许它。我建议您对此进行研究。

我也担心在登录日期分组,但显示第1列和第2列,这可能不会给您预期的结果,因此最好在所有列上分组,或者在第1列和第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

如果不存在,则将索引添加到记录的日期。并检查“解释选择”列1。。。输出为您的问题添加更多信息。日志记录日期是否已编入索引?执行计划是什么?您尝试过什么吗?@juergend:谢谢您的回复,但是logged_date列是按logged_date而不是DATElogged_date进行索引分组的。我相信我已经读到过,对字段执行任何转换,无论多么琐碎,都会阻止索引工作。@octern:没错,但记录的列\u date有日期和时间值,但我想按天分组,除非我调用日期函数,否则我的目的无法解决,任何进一步的帮助都将不胜感激添加列1,GROUPBY子句的第2列可能会完全更改输出。只有当两者都直接依赖于ldate时,才应这样做。