是 否 是 否 是 否 接收 SQL 查询 解析 SQL, 生成语法树 优化器生成执行计划 是否使用 B+ 树索引? 加载 B+ 树根节点 全表扫描 遍历非叶子节点 定位叶子节点 查找目标键值 找到目标键? 获取数据 返回空结果 是否二级索引? 通过主键回表 直接获取整行数据 组装结果集 返回结果给客户端
注意事项
-
mysql中的叶子节点默认是16KB,存储的不只是一条数据,数据的多少是16kB/每条数据大约的大小
从上图可以知晓,叶子节点有页目录结构(非叶子节点也有,当前拿叶子节点分析,结构是一样的),它其实就是一个索引,通过它可以快速找到记录。
页目录分为了多个槽,每个槽都指向对应一个分组内的最大记录,每个分组内都会包含若干条记录。
通过二分查询,利用槽就能直接定位到记录所在的组,从而就能获取到对应的记录。
举个例子,现在有 5 个槽,如果想查找主键为 3 的记录,此时的流程是:
1)通过二分得到槽的中间位置,
low = 0
,high = 4
,(0+4)/2 = 2
; 2)通过槽定位到第二个分组中的主键为 4 的记录,4 大于 3,low = 0
不变,high = 2
; 3)继续二分(0+2)/2 = 1
; 槽 1 中主键 2 小于 3,low = 1
,high = 2
; 4)此时high - low = 1
,可以确定值在 high 即槽 2 中,但是槽 2 只能定位到主键为 4 的记录,又因为槽之间是挨着的,所以可以得到槽 1 的位置,从槽 1 入手拿到 主键 2 的记录,然后因为记录是通过单向链表串起来的,往下遍历即可定位到主键 3 的记录。