我有一个包含500万行的数据库表,我正在运行:
select
*
from
tbl
where
datetime_created
between
'2014-10-01 00:00:00' and
'2014-10-31 23:59:59'
返回428k结果需要54秒
tbl上的列:
id (int pk auto inc)
actor (varchar)
action (enum)
target (varchar)
is_successful (tinyint)
datetime_created (datetime)
索引:
datetime_created (datetime_created, action, target, is_successful)
关于如何改善这一点的任何想法?
编辑:
EXPLAIN结果:
select_type: simple
type: range
possible keys
datetime_created
key: datetime_created
key_len: 8
ref: null
rows: 359569
extra: using index condition
答案 0 :(得分:0)
428k可以一次性使用很多行。即使你有一个日期索引,引擎仍然必须在高值和低值之间扫描表。我会建议多个查询以较小的块读取数据并尽可能缩小结果集。
E.g。尝试添加动作枚举过滤器和日期范围应该会产生更快的结果。假设有5个枚举类型,那么您为每个动作枚举运行5个查询。您添加的索引标准越多,查询将执行的越多。
还要考虑这是否会在应用程序中使用,这是一个庞大的记录集来处理。你真的需要一次使用428k的结果吗?