1

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

我使用的查询是 ::

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

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

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

任何帮助将不胜感激。

4

2 回答 2

2

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

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

如果这是您希望优化的查询,您最好的选择是添加另一列,即logged_date_day(第一个名称已经令人困惑,第二个名称也一样:))

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

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

附言

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

于 2012-07-15T07:02:10.377 回答
0

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

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

确保 group by 中的所有内容都被键入:

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
于 2012-07-15T07:45:05.033 回答