这是我在 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 秒才能执行。
任何帮助将不胜感激。
欢迎。最好还提供表模式。不过,我会做一些猜测:
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 允许它。我建议你调查一下。
我也担心在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