[MySQL] 1-10 B+树和索引结构等

95 阅读3分钟

B站课程地址

www.bilibili.com/video/BV1Zr…

P2.索引的本质, 可以减少磁盘IO次数

image.png

  • 链表: 一条链子, 全表扫描
  • 二叉树: 每个节点下面有两个节点, 大的往右边叉, 小的往左边叉
  • 红黑树: 高级一点的二叉树, 会重新排列 (二叉平衡树)

红黑树, mysql没有选择这种结构, 因为树状结构, 当数据量大的时候, 查询IO次数非常多

image.png

于是想办法将树的层数控制在三四层的情况下, 增加每个节点存储的数据, 这种结构叫做 B树

image.png

P3.B+树结构讲解

MySQL用的是加强版的B树, 叫做B+树

image.png

  1. 这里注意一下, 这里就是一整棵树, 图示这里是三层的树,
  2. 只有最下层的树(页子节点)才存储有data, 每个节点的最大存储大小是16kb
  3. 非页子节点(枝干层)保存的是冗余的索引, 相当于村长家保存有部分村里人的名字和地址
  4. 索引的是按照从小到大来 从左到右排序的 15->18->20->30
  5. 取值(data)的方式: 如上图, 比如现在索引的值是16
  1. 第一次获取, 落在第一层的15-56中, 按照箭头进入对应的第二层
  2. 第二次获取, 落在第二层的15-20中, 按照箭头进入对应的第三层
  3. 第三次获取, 获取到索引为15的data. 完成查询, 从磁盘读取到内存中

P4.Myisam引擎的索引实现

image.png

P5.InnodeDB引擎的索引实现

InnoDB的聚集索引, 直接在索引文件中存储数据, 索引更快.

image.png 如果通过二级索引查询, 类似于index, 需要回表

image.png

P6.为什么不用uuid, 而是用整型的自增ID

第三点, 所以最好不要用uuid(字符串), 而是用整形自增ID, 原因:

  1. 因为二叉树比大小, 数字具有优势
  2. 自增的话, 往往直接往二叉树的右边添加数据, 不会使节点分裂(那棵树的结构要重新排列)

image.png

另外一种数据结构, Hash哈希: 由一维数组+二维链表组成. 基本上不用, 而是用B+tree, 原因:

  1. 仅能满足 = , IN, 不支持范围查询
  2. Hash冲突问题

B+树为什么能进行索引范围查找呢, 原因

B+树的页子节点, 存储了相邻节点的磁盘位置, 这也是B+树和B树的区别

P7.联合索引的底层结构(最左原则的原理: 索引结构的排列)

联合索引的结构↓

image.png

思考下面这3个sql, 哪几个会走索引?

image.png

1. 正确结果只有第一条SQL会走索引, 最左原则:

  1. 一定要从第1个字段开始

  2. 不能跳过左边任意一个字段, 查后面的

2. 为什么会这样呢, 因为在于索引的排序, 看上图, 先排的Name, 再排的age

第二条SQL, 你查age=30的值, 你在第一页看到的是30,31,32. 但是第二页还可能有等于30的,无法预测,索引失效

第一条SQL, 你先查出name=Bill的, 再查age=31, 此时你很确定第二页中没有你要的数据了, 因为已经限定了name=Bill