MySQL现在使用的引擎是innoDB,是现在MySQL默认的存储引擎。MySQL索引背后的数据结构是一棵B+树,那为什么MySQL不用其他的数据结构,而使用B+树呢。我们学习了很多关于搜索的数据结构,那些都不能够使用吗?
首先二分搜索树不能胜任的原因是,MySQL在存储的数据是在磁盘上的,二分搜索树需要对数据进行比较,每次比较都要进行磁盘IO操作,当数据量大的时候,二叉搜索树的高度就变得很高,每次比较数据就要进行磁盘IO操作,导致效率大大降低,所以二分搜索树不适合。
既然索引的目的是更快的查询,那我们知道哈希表的查找效率是很高的,但是为什么不使用哈希表呢,因为我们MySQL查找数据涉及到区间查询,而哈希表存储的数据是分散的,所以不能达到区间查询的效果,所以我们不使用哈希表。
B树:
要了解B+树,首先我们需要知道什么是B树,B树是把N个数据分成N+1个区间,然后按照各个区间的范围进行存储,相比于二叉搜索树,B树的高度大大降低,虽然比较次数没有减少,但是我们的磁盘IO的次数减少了,所以整体的速度比二叉搜索树快。
B+树:
B+树每个节点上都包含多个Key值,有N个key值分成N个区间,父节点的值都会在子节点体现,父节点会作为最大值或者最小值体现在叶子节点,然后最下面的叶子节点用链表相连。
使用B+树可以减少磁盘IO的次数,因为最下面的叶子节点使用了链表连接之后,非常适合进行范围查找。所有的数据存储在叶子节点上,非叶子节点只需要保存key值,非叶子节点占用的空间较小,甚至可以缓存到内存中,一旦放在内存中,这个时候磁盘IO几乎没有了。所以B+树就像为数据库索引量身打造的结构。