我有一个包含 500 万行的数据库表,我正在运行:
select
*
from
tbl
where
datetime_created
between
'2014-10-01 00:00:00' and
'2014-10-31 23:59:59'
花了54秒返回428k结果
表中的列:
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)
关于如何改进这个问题有什么想法吗?
编辑:
解释结果:
select_type: simple
type: range
possible keys
datetime_created
key: datetime_created
key_len: 8
ref: null
rows: 359569
extra: using index condition
最佳答案
428k 是一次需要处理的大量行。即使您有日期索引,引擎仍然必须在高值和低值之间扫描表。我建议多个查询以较小的 block 读取数据,并在可能的情况下缩小结果集。
例如尝试将操作枚举过滤器与日期范围一起添加应该会产生更快的结果。假设有 5 种枚举类型,那么您为每个操作枚举运行 5 个查询。添加的索引条件越多,查询的执行效果就越好。
还要考虑这是否要在应用程序中使用,因为这是一个需要处理的庞大记录集。您真的需要一次处理 428k 个结果吗?
关于mysql - 为什么这个日期范围查询这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26879794/