InnoDB支持的常用的索引:B+树索引,全文索引,哈希索引
B+树是从平衡二叉树演化而来,却不是二叉树。
https://www.cnblogs.com/yichengming/p/11176741.html
B+树索引找到的并不是一个给定键值的具体行,而是被查找数据所在的页,将页读入到内存,再从内存中查找需要的数据
二分查找法(折半查找法):每次取中心点做比较
上图中:顺序查找平均次数:(1+2+3+4+5+6+7+8+9+10)/10 = 5.5次
二分查找平均次数:(4+3+2+4+3+1+4+3+2+3)/10 = 2.9次
二叉查找树:
左子树的键值总是小于根的键值,右子树的键值总是大于根的键值
上图中:二叉查找树的查找平均次数为:(3+3+3+3+4+1)/6 = 2.3 次
顺序查找的查找平均次数为:(1+2+3+4+5+6)/6 = 3/3次
平衡二叉树:
符合二叉树的的定义,且任何节点的俩个子树的高度最大差为1
子树的高度:就是指最大的深度
但是维护平衡性需要多次左旋或者右旋:
B+树:
是为磁盘或其他直接存取辅助设备(对应之前说的查找的是具体数据所在的页,再放入内存)设计的一种平衡查找树
所有记录节点都是按照键值大小顺序放在同一层的叶子节点上,由各叶子节点指针连接
扇出(fan out):是指该模块可直接调用的下级模块的个数
扇入(fan in):是指直接调用该模块的上级模块的个数
B+树的插入操作:
demo:
初始的B+树为图5-6
现在插入28这个键值,则为:
再插入70:
再插入95(95是需要插入90之后的),服务上面第三种情况:
B+树作用于磁盘(再次申明了),所以拆分意味着磁盘的操作,应减少,所以提供了类似于二叉树的旋转(Rotation)功能
上图5-7再插入70时,不会进行拆分index page 操作,而是先进行旋转(一般左兄弟会先检查是否需要旋转),成下图(具体旋转过程不是很懂)
B+树的删除操作:
使用填充因子(fill factor)来控制树的变化,50%是填充因子可设的最小值。B+树删除后依然需要保证删除后的叶子节点记录排序,所以也有三种情况。
填充因子:使用现有数据创建新索引时将每页填满到什么程度。由于在页填充时 mySql 必须花时间来拆分页,因此填充因子会影响性能(就是说上面图中每页的数据不是一定要填满的,填充因子小,就是不填满,数据分散开,占更多的存储空间,但是空位置多,不需要频繁的做拆分等操作,即I/O操作少,性能高。填充因子大则反之)
下面的例子均以填充因子为50%作为标准:(比较的是删除后)
5-9图做删除操作,删除70这条记录,得下图:
再删除键值为25的记录:
再删除键值60:
第二部后结果:
最后的结果(不懂):
感觉是书上画错了,因为前面B+树的插入操作时,明确说明了大于或等于中间节点的是放在右边的(下图80是放在左边的)