MySQL以大间隔查询日期

时间:2012-12-21 13:24:02

标签: mysql performance database-performance database-indexes sqldatetime

我有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;

EXPLAIN说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 个答案:

答案 0 :(得分:3)

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

<强>更新

从我读过的内容来看,MySQL查询优化器往往会在这样的边缘情况下选择错误,因此它可以更轻松地更好地强制执行索引。否则,这是简单的查询,我没有更多的优化空间。

也许在这两列上创建Covering index并强制使用它可以提供最佳效果。