1.什么是索引?
一种硬盘级的数据结构,用于加快sql查询速率。当然,索引也是有利有弊的,它大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
索引主要有Hash索引,主要用于等值查询、B Tree索引等。
下面主要介绍数据库存储引擎(如innodb、myisam)为什么要使用B+树来实现索引,从演进进程着手。
2.存储引擎中索引实现的演进过程
Hash索引的实现可以是一个链表,它的复杂度o(1)
为了达到更高的查询速率,二叉树的实现方式就随之出现了,二叉树是以二分查找方式进行搜索,时间复杂度就减少了
但是为什么Mysql索引的实现还不使用二叉树呢?原来只它会出现以下两种情况:
这样的结构其查询效率跟hash索引毫无区别。Therefore, 为了避免这种结构的出现,不得不让人联想到 平衡二叉树,因为它有一个特点就是树的最高深度与次高深度的差值小于等于1。下图就是平衡二叉树的图示。
平衡二叉树的结构看起来好像挺完美的,但是想想平时存储的数据的大小,那是TB、PB级别的了。针对这种情况使用平衡二叉树,导致的结果就是平衡二叉树的深度太高,这样导致查询的效率也不高了,那么聪明的我们是不是能想到有什么方式来减少这种由于树的深度而导致的效率低下呢?
当然,我们很聪明,所以就出来了B树。这是多路平衡树。它的特点:一就是完全平衡,即树的最高深度与次高深度的差值为0,二就是这棵树上的每个节点存储的key是多个了。下图就是它的示例:
顺便多提一嘴:这B树父节点是如何来划分支路的?比如根节点(004,008)是两个key,那么它就会分成n+1条支路,如图所示,第一条支路存储的key值范围:1-4,第二条是4-8,第三条是大于8的,也就是说B树的支路划分是以其key的范围来完成的。
也许,大家看到这儿以为Mysql索引的实现就是B树了,No,No,No。它真正的实现方式是B+树。
B+树,它是加强版的B树,它与B树的区别:一就是B树每个节点都有数据区,而B+树只有叶子节点才有数据区。这样带来的好处就是非叶子节点就可以存储更多的key,那么就会减少树的层数,效率也就提高了。二是B+树每条支路的叶子节点尾首相连的,类似于一条链表结构。这样的好处就是便于范围查询。
以上是我对MySQL索引的认识。若有不足之处,敬请谅解,也可以指出问题,后续会进行改进。