1. MySQL 的代价模型,query_cache、engine_condition_pushdown 的影响?
MySQL 的代价模型如何评估查询?optimizer_switch 中的 engine_condition_pushdown(索引下推 ICP)对代价与执行有什么影响?query_cache 对代价模型有什么历史影响?
- MySQL 代价模型:估算行数 × 块读取与行评估代价
- ICP(index_condition_pushdown)下推过滤减少回表,EXPLAIN 显示 Using index condition
- query_cache 已在 8.0 移除,命中时无需执行计划
MySQL 优化器按"估算行数 + 代价系数"评估:全表扫描代价 ≈ 读取页数 × 每块读取代价,索引扫描还需叠加回表代价。ICP(optimizer_switch 的 index_condition_pushdown,默认 ON)把"索引无法定位但属于索引列的非前缀条件"下推到存储引擎,在索引扫描时提前过滤,只有通过过滤的行才回表,EXPLAIN 显示 Using index condition——代价模型中"回表行数"的估算随之下降,这是 5.6 以来对二级索引扫描最有效的优化之一。
query_cache(8.0 已移除)的历史影响:命中缓存时直接返回结果、完全不产生执行计划,谈不上代价评估;但失效机制(表更新即整库清相关项)引发争用与抖动,8.0 彻底移除后代价评估更加纯粹,也消除了"缓存命中率"对调优的干扰。理解这一点有助于解释为何老调优文档中的 query_cache 建议已不适用。
本题考察代价模型的两个外部因素:ICP 通过减少回表行数进入代价公式,query_cache 则是"绕过代价模型"的历史通道。回答时区分"影响代价"与"绕过代价"两类机制。