- • IO 成本:1 个数据页 = 1.0(MySQL 约定值)
- • CPU 成本:检测 1 行 = 0.2(MySQL 约定值)
- • 全表扫描 = 页数×1.0 + rows×0.2 + 微调值
- • 索引访问 = 区间数×1.0 + n×0.2 + 回表 n×1.0 + n×0.2
- • 页数 = data_length ÷ 1024 ÷ 16KB
- • rows 是 InnoDB 的估计值,不是精确值
- • 索引命中行数 n 靠统计信息粗略估算
- • 回表按"1 行 = 1 页"粗暴折算
- • 执行前精准算出所有方案成本不现实
- • 结论:估算不准也要比 —— 相对大小就够选型
- • 思路与单表完全一致:逐表算成本、取最低
- • 驱动表:按 WHERE 筛选条件的各方案估算
- • 被驱动表:按 ON 连接列 + 筛选列的各方案估算
- • 多个索引都可用(possible_keys)→ 每个都算一遍
- • 这解释了 EXPLAIN 里 key 为什么"弃索引选全表":索引区分度太低时,索引成本 ≈ 全表成本