mysql索引为何是B+树

  • 计算机存储特点及mysql InnoDB存储引擎存储
  • B+树存储数据结构
  • 分析
  • 索引过程,如15
  • 特点
  • B+数的高度计算
  • 继续上述的键值和指针,一颗B+数可以存储多少的数据
  • 经典问题


计算机存储特点及mysql InnoDB存储引擎存储

在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)的最小单元是块,一个块的大小是4k,而对于InnoDB存储引擎也有自己的最小储存单元,页(Page),一个页的大小是16k

mysql 根据叶子节查询所有层级节点一直到根节点 mysql叶子节点最大数据大小_数据

B+树存储数据结构

mysql 根据叶子节查询所有层级节点一直到根节点 mysql叶子节点最大数据大小_键值_02

分析

存储,[5,28) 左闭右开
这棵B+树有3层

  1. 第一层:键值和指针
  2. 第二层:键值和指针
  3. 第三层:子叶节点,存放具体

的数据,存储单元为一页,一页中可能存在多条数据,数据有序且由链表连接

索引过程,如15

  1. 从根节点N1开始索引
  2. N1中,15 在5-28范围内,所以走P1指针所在的节点N21
  3. N21中,15 在 10-20 范围内,所以走P2指针所指的节点N32
  4. 将N32中的数据读取到内存中,获取需要的数据

特点

  1. InnoDB存储引擎的最小存储单元是页,页可以用于存放数据也可以用于存放键值+指针,在B+树中叶子节点存放数据,非叶子节点存放键值+指针。
  2. 索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而在去数据页中查找到需要的数据;
  3. B+树还有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。

B+数的高度计算

B+树高度计算公式: logBN = log N / log B
N: 数据条数
B:页中(键值+指针)单元个数
技术示例:
数据条数为1000W的表,主键为BigInteger类型8字节,指针大小为6字节
由上可知一页的大小为16K,一组指针和键值为14字节,计算:

16*1024/14 = 1170
logBN = log 10^7 / log 1170 = 2.28

继续上述的键值和指针,一颗B+数可以存储多少的数据

假设子叶节点中保存一条数据的大小为1K,则一页可保存16条数据
假设一颗树的高度为3,则可保存的 键值+指针 的 组合数为 1170 * 1170 种
可得出结论,可存储 2100W的数据

1170 * 1170 * 16 = 21,902,400

经典问题

mysql索引为什么使用B+数,而不使用其他数据结构,如B树
答:
1.B+树非子叶节点不存储数据,仅存储键值和指针,子叶节点中存储数据,而B树及其他数在子叶节点和非子叶节点中都存储数据,减少了键值和指针的数量只能通过增加树的高度来解决,固而增加磁盘IO次数,影响性能。
2.B+树有一个好处就是方便扫库,子叶节点有序排列对范围查询十分友好,而其他B树不支持。