MYSQL性能优化之B+树、二叉树、红黑树,为何MYSQL使用B+树?

90 阅读3分钟

在介绍B+树之前,讲一讲二叉树和红黑树,介绍一个方便可视化查看各种数据结构的网站 www.cs.usfca.edu/~galles/vis…

二叉树

二叉树:小的节点放右边,大的节点放左边,那么对于递增的数据是有问题的,二叉树退化成了单链表

image.png

红黑树

红黑树:又名平衡二叉树,能够进行平衡的二叉树,很明显虽然能够平衡,但是数据量大了之后层级太多

image.png

B+树

B+树:B+树基于此进行优化,减少了层级,每一个节点可以保存16KB的数据 根据图中进行解释,分别又15、56、77,白色空格内记录着下一层节点的地址,最底层则保存着所有的数据,中间的叶子节点存储的是冗余的索引,当我们要寻找索引为30的数据,就可以通过15-56之间的白色节点存储的地址,找到下一层15-49的索引,然后找到20-49之间白色空格所代表的地址,最终找到最下层数据

于是乎我们可以计算一下,假设层级只有三层的情况下,一个节点可以保存16KB的数据,每个索引假设bigInt大概8B,磁盘文件地址占6B,那么一个节点能够存储1170个数据,第二层同理也是1170个,第三层的数据,假设data数据行记录1KB,那么1170117016约等于2千万左右条数据

MYSQL会在一开始加载数据到内存中,那么查找一条数据,最快走一次磁盘IO,慢一点就是2-3次磁盘IO,性能得到大大的提高 B树和B+树的区别在于B+树能够做范围查询,可以看到图中节点之间使用双向链表连接,保存着相邻节点之间的磁盘地址,且索引是有序的,因此范围查询效率高

image.png

非聚集索引,多一次回表操作

image.png

主键聚集索引

image.png

InnoDB使用整形主键进行判断,比使用uuid进行判断要快,至于为何使用主键,如果没有主键,则会使用唯一键,如果没有唯一键,mysql会维护一个rowId进行定位

什么是聚集索引

什么是聚集索引,简单的说就是通过这个索引可以直接一次性拿取到所有字段的数据,不需要单独再进行回表操作

普通、非聚集索引,多一次回表操作

image.png

hash索引

image.png

覆盖索引

image.png

索引下推

什么是索引下推呢,当我们使用二级索引的时候,由于使用了select *; 许多字段都不是索引,因此会发生回表,5.6版本之前没有优化,因此查询多少条数据就回多少次表,优化之后将范围查询的数据,通过索引找到ID,通过id去查询数据,只进行一次回表的操作,这就是索引下推

什么是回表

回表就是在非聚集索引中,通过索引关联到id,而不是所有的数据,我只能拿着这个id去聚集索引中定位数据的这么个过程就叫做回表

索引使用口诀:

image.png