当前位置: 首页 > article >正文

InnoDB 查询成本

1. 单表查询成本

连接查询总成本 = IO 成本 + CPU 成本

对于 InnoDB 存储引擎来说,页是磁盘和内存之间交互的基本单位,设计MySQL的大叔规定读取一个页面花费的成本默认是 1.0,读取以及检测一条记录是否符合搜索条件的成本默认是 0.21.00.2 这些数字称之为 成本常数,这两个成本常数我们最常用到。

如果是走索引,则需要计算需要回表的记录数量,来计算 CPU 成本。记录数量的计算方式为:先获取索引对应的 B+ 树的 区间最左记录区间最右记录,然后再计算这两条记录之间有多少记录(记录条数少的时候可以做到精确计算,多的时候只能估算)。这种通过直接访问索引对应的 B+ 树来计算某个范围区间对应的索引记录条数的方式称之为 index dive

与之对应的是「基于索引统计数据」来预估记录条数,一般是发生在使用 IN 进行范围查询,且 IN 里面的条件较多时。因为针对 IN 中的每个单点区间,都需要单独走一次 index dive,一旦数量较多(取决于设置的系统变量 eq_range_index_dive_limit),那在 index dive 上损耗的性能就会较多。这个时候 MySQL 就会更倾向于用「基于索引统计数据」的方式来预估记录条数。这就解释了为什么使用 IN 时可能会导致索引失效。

2.联表查询成本

连接查询总成本 = 单次访问驱动表的成本 + 驱动表扇出数 x 单次访问被驱动表的成本

这里的扇出数实际上就是驱动表经过条件过滤后剩余的记录数。

3.成本常数

通过调整 server_cost 或者 engine_cost 表的成本常数,可以引导 MySQL 去生成倾向于全表扫描或倾向于搜索索引的执行计划。


参考:《MySQL 是怎样运行的》


http://www.kler.cn/a/444389.html

相关文章:

  • Java模拟Mqtt客户端连接Mqtt Broker
  • 【Prompt Engineering】6 文本扩展
  • 【Rust自学】4.4. 引用与借用
  • android recycleview 中倒计时数据错乱
  • Mamba安装环境和使用,anaconda环境打包
  • 对BG兼并点的理解-不断刷新版
  • 【Leetcode Top 100】105. 从前序与中序遍历序列构造二叉树
  • Python:动态粒子爱心
  • Spring IOC 和 AOP的学习笔记
  • Spring篇--xml方式整合第三方框架
  • linux CentOS系统上卸载docker
  • Android Binder 进程间通信
  • 肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)
  • Diffusino Policy学习note
  • Unbuntu下怎么生成SSL自签证书?
  • 聊聊开源的虚拟化平台--PVE
  • 02、10个富士胶片模拟的设置
  • 使用 Canal 监听 MySQL Binlog 日志实现最终一致性
  • 《算法SM3》题目
  • 零基础开始学习鸿蒙开发-交友软件页面设计
  • 【开源免费】基于Vue和SpringBoot的靓车汽车销售网站(附论文)
  • 系统移植——Linux 内核顶层 Makefile 详解
  • 谈谈网络流量控制
  • python学opencv|读取图像(十六)修改HSV图像HSV值
  • 【自用】通信内网部署rzgxxt项目_01,后端pipeDemo部署(使用nssm.exe仿照nohup)
  • 1、数据库概念和mysql表的管理