mysql中数据是如何被用B+树查询到的

innoDB是按照页为单位读写的

那页中有很多行数据,是怎么执行查询的呢,首先我们肯定,是以单向列表形式存储的,提高了增删的效率,但是查询效率低。所以实际上对页中的行数据进行了优化,能以二分的方式进行查询,执行这一操作的机制叫做页目录 ,在页的内部建立分组(包括最大和最小记录,但不包括被删除了的记录)。按照从小到大顺序排列,每组的最大的记录的头信息(file_header)存储着本组记录的数量(见粉红色字段)。页目录存储的是最后一条记录的地址偏移量(槽、slot,相当于页目录有个指针,指向每个组的最后一条记录)。所以二分就能根据每个slot的最大值判定当前查询应该去哪个分组。

然后我们抽象到更高层次,页如何被查询的?其实B+树的每个节点都是一页,只不过非叶子节点的数据是指针。叶子节点才是真的数据。

然后索引又分为聚簇索引和二级索引。

聚簇索引一般是主键索引,如果没有主键就选不包含NULL值得唯一列,如果还没有MySQL会创建一个隐藏的自增id列当作聚簇索引。聚簇索引叶子节点存的是真实数据。

二级索引就是建立的索引,叶子节点存放的是主键值,也就是说用了二级索引,查到后,还要用查到的主键值再查一遍聚簇索引才能获取数据结果,这个过程叫做回表。但假如你要查的就是主键,那就只查一次即可。

相关推荐
武子康几秒前
Java-182 OSS 权限控制实战:ACL / RAM / Bucket Policy 与错误排查
java·数据库·阿里云·云计算·oss·fastdfs·fdfs
李慕婉学姐2 分钟前
基于微信小程序的康复医疗问诊服务平台5855qb95(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·微信小程序
linux修理工5 分钟前
vagrant ansible 配置
linux·运维·服务器·数据库·centos
一只落魄的蜂鸟7 分钟前
《图解技术体系》Three architectures and application scenarios of Redis
数据库·redis·缓存
hanyi_qwe8 分钟前
MySQL数据库管理
数据库·mysql
i***778010 分钟前
PostgreSQL_安装部署
数据库·postgresql
想不明白的过度思考者15 分钟前
MySQL数据库(库)操作精讲:从入门到精通
数据库·mysql·oracle
Gauss松鼠会18 分钟前
【GaussDB】如何从GaussDB发布包中提取出内核二进制文件
linux·数据库·database·gaussdb
天行健,君子而铎19 分钟前
“数据防泄漏”(Data Loss Prevention, DLP)
大数据·数据库·安全·系统安全·学习方法·安全架构
Highcharts.js21 分钟前
Highcharts Gantt 甘特图任务配置文档说明
java·数据库·甘特图·模板模式·highcharts·任务关系