mysql-查询的成本
mysql的查询优化器会找出执行该语句的所有可能的方案,对比找出成本最低的执行计划
1. 计算全表扫描的成本
计算全表扫描需要两个信息,聚簇索引占用的页面数,该表的记录数,mysql为每个表维护了一系列的统计信息 使用 SHOW TABLE STATUS可以查看信息
rows 对应myisam这个值是准确的,对于innodb是个估算值
data length 表数据占用的字节数 加入data length 值为 1589248 默认一个页16k 可以计算出有97个页
- 计算io成本
97 * 1.0 +1.1 = 98,1 97指索引占用的页数,1.0 是加载一个页面的成本常数,1.1 是个微调值
- 计算cpu成本
9693 * 0.2 + 1.0 = 1939.6 9693为rows记录数 0.2是访问一条记录的成本常数 后面1.0是微调值
2. 范围查询成本计算
index dive 通过访问索引对应的b+树来计算某个范围区间的索引记录条数的方式称为index dive 比如in方法中传入10,100 先查找到索引为10的记录 然后查到索引为100的记录,
如果跨页就查找上一个索引记录页 计算跨几个页就行
这个dive值可配置 超过了就使用索引统计数据来估算 mysql为每个索引维护一个统计数据
根据rows / Cardinality 求出单条记录重复值大小
参数个数 * 单条记录重复值大小计算出需要回表的数量
3. 多表查询的成本计算
有一部分估值需要猜测,不是准确值
- 如果是使用全表扫描 计算驱动扇出需要猜
- 使用索引扫描 需要猜驱动表扇出除索引条件外满足其他搜索条件的记录数
这个过程称为condition filtering

n_rows的计算方法是:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!