Mysql索引
Mysql的索引:
本篇博客主要来探讨一下Mysql中的索引的问题:
主要参考博客:
1.MySQL用B+树(而不是其他数据结构)做索引的原因_黄贞辉的博客-CSDN博客
2.《Mysql的高级特性》
我们需要比较几种数据结构:
- hash表:
注意hash表中数据是乱序的,查询任何一行的数据都只需要依次IO,但是只能查询一行,不能够查询范围
- 二叉树:
1.可能会单边增长,退化成为链表,查询的效率与没建立索引时候的效率会差不多
2.二叉树顾名思义是树只有左孩子与右孩子,会导致树的层次太高,IO次数较高。
- 红黑树:
1.红黑树虽然解决的退化的问题,但是也才是二叉,在数据库中数据过多的时候会导致树的层次太高,进而导致IO的此时增多
2.此外我们在构建红黑树的时候,我们会设计到红黑树的左旋或者是右旋或者是变色,会导致采用红黑树后整个插入数据时候变慢,另外红黑树维护的数据结构也较为复杂
- B树:
先来看一下B树的数据结构:
特点:
- 内部结点与叶子阶段均存放数据
- 叶子结点是互不关联的
如果采用B树会造成的缺点:
1.B树的叶子结点与内部结点均存放的数据,会造成数据存储时候开销较大
2.此外B树的叶子节点是互不关联的,会导致顺序检索非常麻烦
- AVL树:
AVL树称之为平衡的二叉搜索树,是为了解决二叉搜索树在极端的情况下会退化成单支树。它具有以下的性质:
1.左右的子树均是AVL树
2.左右子树的高度差又称之为平衡因子不超过1
利用AVL树作为Mysql的索引的缺点:
1.对于AVL树本身来说其数据结构较为复杂,则会占用磁盘的开销
2.此外AVL树需要保证平衡,那么就会导致与红黑树有相同的缺点就是涉及到树的旋转,这一块的开销也非常的大
那么我们接下来看一下Mysql默认的索引数据结构:
B+树索引:
特点:
1.多路排序树
2.内部结点不存data数据,只有叶子结点才存data
3.叶子节点左右相连,形成一条有序的双向循环链表
为什么Mysql选择采用B+树作索引:
- B树适用于随机检索,而B+树适用于随机检索与顺序检索
- B+树的空间利用率更加的高,因为B树每一个结点要存储键与值,而B+树的内部结点只存储键,这样B+树的一个结点就可以存储更多的索引,从而使得树的高度变低,减少了I/O次数,使得数据检索速度更加快
- B+树的叶子结点都是连接在一起的,所以更加适合范围查询,顺序查找更加方便
- B+树的性能更加的稳定,因为在B+树中,每次查找都是从根节点到叶子结点,而在B树中,要查询的值可能不在叶子结点,而是在内部结点就已经找到。