MySQL索引篇---数据结构的选择
由于MySQL是将数据存储在硬盘中的,而访问硬盘中的数据的速度是很慢的,所以为了提高MySQL的查询效率,就创建了索引来帮助提高查询效率。
1.什么是索引
MySQL中的索引是一种数据结构,它可以帮助数据库更高效地查询、更新表中的数据。索引通过一定的规则去排列数据表中的记录,这样就可以帮助我们在查询数据时,可以通过索引来高效地查询数据
那么,MySQL中的索引使用了那种数据结构呢?
2.索引的数据结构
第一种数据结构:HASH
哈希表的查询时间复杂度为O(1),但是MySQL中没有选择HASH作为索引的数据结构,因为HASH不止范围查询
第二种数据结构:平衡二叉树
平衡二叉树有一个特点,就是它的中序遍历的结果是一个有序序列,也就说明了平衡二叉树可以实现范围查询,大部分情况下,查询的时间复杂度为O(logN),但是在最坏情况下,平衡二叉树会退化为单边树,这就会导致查询的时间复杂度退化为O(N),还有一个缺点就是一个节点最多只能拥有两个节点,这就导致在节点过多的情况下,平衡二叉树无法很好的控制树高,由于MySQL是将数据存储在硬盘中的,如果使用的索引数据结构是平衡二叉树,每一次访问叶子节点就要进行一次磁盘IO,如果叶子节点很多且树的高度很多,这就意味着需要进行很多次的磁盘IO,此时查询效率就会大打折扣
第3种数据结构:N叉树,也称B树
在N叉树中,允许每一个节点拥有超过两个的子节点(N叉树有一个度的概念,度代表着一个节点最多只能拥有几个子节点,一般子节点个数的小于度的值),这就很好地解决了控制树高的问题,这就意味着在数据量相同的情况下,N叉树相对于平衡二叉树来说,进行一次查询会进行更少次数的磁盘IO,从而更快的找到目标节点,这就大大提高了查询效率,查询的时间复杂度:O(logN)
但是这还不是MySQL中的索引使用的数据结构
第4种数据结构:B+树
B+树就是MySQL中索引使用的数据结构,那么B+树和B树有什么区别呢?
首先,B+树中的叶子节点都保存了一个指向相邻的叶子节点的引用,这就使B+树中的叶子节点之间形成了一个单向链表,从而可以通过一个叶子节点来找到其相邻的兄弟节点,但是MySQL中对这一部分也进行了一点优化,在MySQL中,组织叶子节点的方式是使用了双向链表的形式
其次,在B+树中,非叶子节点中的值都包含在了叶子节点中,但是在MySQL中,B+树的非叶子节点只保存了连接其子节点的索引,非叶子节点中不包含真正的数据,真正的数据都包含在叶子节点中
最后就是,对于B+树而言,在相同树高的情况下,查找任意一个数据的时间复杂度都是一样的,性能均衡