我有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的行为是否正常?
答案 0 :(得分:3)
当结果集超过所有行的8-9%时,MySQL会进行全表扫描。 对我来说,有一天你会在全表扫描方向上添加摆动MySQL。 您可以尝试强制索引以查看结果是否更好。
<强>更新强>
从我读过的内容来看,MySQL查询优化器往往会在这样的边缘情况下选择错误,因此它可以更轻松地更好地强制执行索引。否则,这是简单的查询,我没有更多的优化空间。
也许在这两列上创建Covering index并强制使用它可以提供最佳效果。