mysql - 为什么这个日期范围查询这么慢?

标签 mysql

我有一个包含 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/

相关文章:

mysql - 从表中获取符合条件的学生的 SQL 查询错误

mysql - 如何从 MySQL 中的过程返回准备好的查询结果

python - Django:如何在启动时禁用数据库状态检查?

android - 在android中从mysql数据库搜索多个数据时出现问题

javascript - 使用 mysqljs 执行 UPDATE 语句

php - 为什么循环不能均匀缩放?

mysql - 从 ZendFramework 获取完整的堆栈跟踪

MySQL - 使用 SET 语句更新查询取决于前一个 SET 语句的结果

php - 在 PHP 中将数组转换为字符串

php - 来自多个订单的发票?