我有一个包含大约700万行的表,我不断运行这类查询:
SELECT
MyField,
COUNT(*)
FROM
MyTable
WHERE
MyField2='ConstantValue'
AND MyField NOT IN ( SELECT Field
FROM AnotherTable)
AND Timestamp >= [ArbitraryTimestamp]
GROUP BY
MyField;
以上领域的基数:
正如所料,这种情况非常缓慢,使用EXPLAIN
告诉我,我Using where; Using temporary; Using filesort
。
我想通过在此表中添加索引来提高这些查询的效率,但我不确定最好的方法是什么。
我应该在MyField
上添加索引吗?和Timestamp
上的索引?都?两者的综合指数?
另外,我还能做些什么来加速这些类型的查询吗?
答案 0 :(得分:0)
您应首先使用MyField添加双键索引(分组依据):
CREATE INDEX MyIndex
ON MyTable (MyField, Timestamp)
答案 1 :(得分:0)
MyField上的GROUPBY
将强制MySQL创建一个临时表,这就是你在EXPLAIN中获得using temporary
的原因。创建一个包含约700万行的临时表肯定是一个痛苦的查询。
要尝试的事情(在实施每个建议后,重新运行查询并检查查询时间):
如果以上都不能立即为您提供帮助,请查看此post,了解如何使用子查询来获取计数,这样可以完全避免使用GROUP BY。