InnoDB 存储引擎中的 B+ 树索引演变过程
1、哈希表

优点:查询特定的值的时候,特别快,例如查a = 3
缺点:
1、哈希表冲突会造成数据散列不均匀,会产生大量的线程查询,比较浪费时间
2、不支持范围查询,当进行范围查询的时候,必须要全部遍历,例如查a > 3
3、对于内存空间的要求比较高,读入内存需要将整个哈希表读进内存
在mysql中有没有hash索引?
1、memory存储引挚使用的是hash索引
2、innodb支持自适应hash索引(innodb存储引擎自己决定是用hash索引存还是B+树存)
2、二叉搜索树
特性:插入数据的时候必须有序,左子树必须小于根结点,右子树必须大于根结点,使用二分查找来提高查找效率
问题:如果数据插入是递增或递减的顺序的话,怎么办?例如插入顺序是1,2,3,4,5... 就变成的链式插入形式了,查询的时候最坏情况下是的时间复杂度
3、平衡二叉树
性质:通过左旋和右旋让树变平衡,最短子树和最长子树高度只差不超过1
为了保证平衡,在插入数据的时候必须要旋转,旋转消耗性能,插入时性能下降,而查询性能上升了

如果这时插入操作多,查询数据少呢???
4、红黑树
比较复杂,大概意思是,让最长子树只要不超过最短子树的两倍即可,因此在平衡二叉树的基础上,使得查询性能和插入性能近似取得一个平衡

随着数据的插入,发现数的深度越来越深,意味着IO次数越多,影响数据读取的效率
5、B树 和 B+树
把原来的有序二叉树变成多叉树
B树

B+树

①B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据。
之所以这么做是因为在数据库中页的大小是固定的,InnoDB 中页的默认大小是 16KB。
如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的 IO 次数又会再次减少,数据查询的效率也会更快。
②因为 B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。