我有 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 行为?