MySQL 的 B+ 树中查询数据的全过程

接收 SQL 查询
解析 SQL, 生成语法树
优化器生成执行计划
是否使用 B+ 树索引?
加载 B+ 树根节点
全表扫描
遍历非叶子节点
定位叶子节点
查找目标键值
找到目标键?
获取数据
返回空结果
是否二级索引?
通过主键回表
直接获取整行数据
组装结果集
返回结果给客户端

注意事项

  • mysql中的叶子节点默认是16KB,存储的不只是一条数据,数据的多少是16kB/每条数据大约的大小

    MySQL 的 B+ 树中查询数据的全过程_第1张图片

    从上图可以知晓,叶子节点有页目录结构(非叶子节点也有,当前拿叶子节点分析,结构是一样的),它其实就是一个索引,通过它可以快速找到记录。

    页目录分为了多个槽,每个槽都指向对应一个分组内的最大记录,每个分组内都会包含若干条记录。

    通过二分查询,利用槽就能直接定位到记录所在的组,从而就能获取到对应的记录。

    举个例子,现在有 5 个槽,如果想查找主键为 3 的记录,此时的流程是:

    1)通过二分得到槽的中间位置,low = 0high = 4(0+4)/2 = 2; 2)通过槽定位到第二个分组中的主键为 4 的记录,4 大于 3,low = 0 不变,high = 2; 3)继续二分 (0+2)/2 = 1; 槽 1 中主键 2 小于 3,low = 1high = 2; 4)此时 high - low = 1,可以确定值在 high 即槽 2 中,但是槽 2 只能定位到主键为 4 的记录,又因为槽之间是挨着的,所以可以得到槽 1 的位置,从槽 1 入手拿到 主键 2 的记录,然后因为记录是通过单向链表串起来的,往下遍历即可定位到主键 3 的记录。

你可能感兴趣的:(mysql,数据库)