1、引言
Mysql默认使用B-tree作为索引的存储方式,设计数据表索引时我们会纠结选B-tree或hash,只有彻底理解了B-tree的数据结构,才能真正理解mysql索引的作用,在Mysql性能优化的时候才能正确分析
B-Tree:多列索引中,范围查询,会导致后面的列无序,因此右边的索引将不起作用
这个是索引优化的核心。
2、B-tree结构
B-tree:我们都知道平衡二叉树,每个节点最多两个子树,左边小于右边,叶子节点到根节点的距离,绝对值不会小于1,方便查询,
B-tree就是M叉平衡树,但是有几个特性,决定了这个M叉平衡树的特色
,先上图,看看什么是b_tree:
这是一个三叉平衡二叉树:
对于M叉平衡二叉树,有以下几点:
1、大小顺序:左中右
2、叶子节点到根节点的距离绝对值<=1
3、结点中最多有m个子树
4、每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,……,Kn,Pn)。
其中 ceil(m/2)<=n<=m-1. n代表节点保存的数据个数
比如:m=5时,2<=n<=4
下限是在删除数据时起约束作用,上限是在增加数据时起约束作用
特别提醒:mysql中不可能一个索引中的所有节点都存储在同一个数据块中,一般1k~4K就会换一个数据块,可以用下图看看
我们根据上面的几条准则,来增加一个索引和删除一个索引的过程:
就一点和我们的平衡二叉树不同,要分裂
当该节点的数据量达到上限m-1的时候,将数据放进去,形成m个数据,然后把最中间的数作父节点,往上新生成节点:如果父节点也满了,再次往上分裂
删除数据时,看下限,如果小于ceil(m/2)就往上合并