MySQL 按日期查询大间隔

Posted

技术标签:

【中文标题】MySQL 按日期查询大间隔【英文标题】:MySQL query by date with big inverval 【发布时间】:2012-12-09 02:03:04 【问题描述】:

我有 2200 万条记录的大表。 我要执行下一个查询:

select auto_alerts from alerts_stat  where endDate > "2012-12-01"

为了提高性能,我为 endData 字段添加了 BTREE 索引:

CREATE INDEX endDate_index USING BTREE ON alerts_stat(endDate)

在我开始分析查询执行计划之后:

当我想获取 15 到 7 天前的参数时:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 7;

我得到下一个执行计划来处理 2,762,088 行。

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'range', 'endDate_index', 'endDate_index', '4', NULL, '2762088', 'Using where'

当我将间隔增加一天时,我收到:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 6;

解释说 mysql 计划处理所有 22,923,126 行。

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'ALL', 'endDate_index', NULL, NULL, NULL, '22932390', 'Using where'

例如在 WHERE 过程中选择不带任何条件的 22,925,642。

我可以改进执行计划吗?也许我在某个地方有错误,或者是正常的 MySQL 行为?

【问题讨论】:

【参考方案1】:

当结果集超过所有行的 8-9% 时,MySQL 会进行全表扫描。 对我来说,看起来有一天你会在全表扫描方向添加摆动 MySQL。 您可以尝试强制索引以查看结果是否更好。

更新:

根据我的阅读,MySQL 查询优化器往往会在这样的边缘情况下选择错误,因此它可以很容易地更好地强制索引。否则,这是一个简单的查询,我没有太多优化的空间。

也许在这两列上创建一个Covering index 并强制使用它可能会产生最佳结果。

【讨论】:

谢谢。认为这是我的情况。所以这是 MySQL 特定的行为。我可以以某种方式改进查询以获取例如 sum('alerts_sp') 的大间隔吗?

以上是关于MySQL 按日期查询大间隔的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询中按日期、天间隔分组

mysql查询两个日期的时间间隔,以秒为单位

按 15 分钟间隔对 mysql 查询进行分组

MySql按照日期查询数据

[MSsql] 如何查询近30天的数据

MySQL中判断日期间隔的方法