用EXPLAIN FORMAT=JSON确认MRR生效后,用计时验证在本机NVMe SSD上MRR是否真的带来了预期的性能提升。
MRR的设计初衷是把范围扫描里零散的行查找排序,换成更顺序的磁盘访问。
建表插入CREATE TABLE t17 (id INT PRIMARY KEY AUTO_INCREMENT, k INT, payload VARCHAR(200), INDEX idx_k(k)); 插入50万行,k随机1~100000 SET SESSION optimizer_switch='mrr=on,mrr_cost_based=off';
普通EXPLAIN文本看不出来,要用JSON格式才能确认。
结果EXPLAIN FORMAT=JSON SELECT * FROM t17 WHERE k BETWEEN 1000 AND 3000 "operation": "Index range scan (Multi-Range Read) on t17 using idx_k ..." "multi_range_read": true
确认了:把 mrr_cost_based 关掉、强制 mrr=on 之后,这次范围扫描用上了MRR——操作文本里明确写着"(Multi-Range Read)",JSON里 multi_range_read 字段是true。
按理论,MRR应该通过排序访问顺序减少随机I/O。
结果(3次重复)mrr=on,mrr_cost_based=off: 0.0629s / 0.0287s / 0.0266s mrr=off: 0.0293s / 0.0264s / 0.0263s (mrr=off每次都不比mrr=on慢,甚至经常更快)
测出的结果跟理论预期相反:开启MRR并没有带来速度提升,多次重复测试里 mrr=off 始终跟 mrr=on 持平或更快,从未出现明显的性能优势。
每一步都是本文上面用EXPLAIN和计时跑出来的原始结果。
EXPLAIN FORMAT=JSON / optimizer_switch mrr:验证MRR生效与性能