在介绍B+树之前,讲一讲二叉树和红黑树,介绍一个方便可视化查看各种数据结构的网站 www.cs.usfca.edu/~galles/vis…
二叉树
二叉树:小的节点放右边,大的节点放左边,那么对于递增的数据是有问题的,二叉树退化成了单链表
红黑树
红黑树:又名平衡二叉树,能够进行平衡的二叉树,很明显虽然能够平衡,但是数据量大了之后层级太多
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+树能够做范围查询,可以看到图中节点之间使用双向链表连接,保存着相邻节点之间的磁盘地址,且索引是有序的,因此范围查询效率高
非聚集索引,多一次回表操作
主键聚集索引
InnoDB使用整形主键进行判断,比使用uuid进行判断要快,至于为何使用主键,如果没有主键,则会使用唯一键,如果没有唯一键,mysql会维护一个rowId进行定位
什么是聚集索引
什么是聚集索引,简单的说就是通过这个索引可以直接一次性拿取到所有字段的数据,不需要单独再进行回表操作
普通、非聚集索引,多一次回表操作
hash索引
覆盖索引
索引下推
什么是索引下推呢,当我们使用二级索引的时候,由于使用了select *; 许多字段都不是索引,因此会发生回表,5.6版本之前没有优化,因此查询多少条数据就回多少次表,优化之后将范围查询的数据,通过索引找到ID,通过id去查询数据,只进行一次回表的操作,这就是索引下推
什么是回表
回表就是在非聚集索引中,通过索引关联到id,而不是所有的数据,我只能拿着这个id去聚集索引中定位数据的这么个过程就叫做回表
索引使用口诀: