sql索引规则
1、一般使用B树,B+树/B-树,B*树
索引树:https://blog.csdn.net/u013411246/article/details/81088914
B树(二叉树):每个节点只存一个关键字,且只有两个分叉,等于则命中,小于走左节点,大于走右节点,
所以不确定走多少节点命中,最好的结果是根节点命中,最坏是叶节点命中。
应尽量避免一条线的情况(2-3-4-5-6,全部在右边或全部在左边)
B-树(B-树是开区间):多路搜索树,每个节点存M/2-M个关键字,非叶子节点存储指向关键字范围的子节点
关键字分布在整个树中,搜索可能会在非叶节点结束,自动层次控制
B+树:在B-树的基础上增加了链表指针,所有的关键字都存在叶节点上(稠密索引),非叶节点作为叶节点的索引(稀疏索引)
B+树总是到叶节点才能命中,
且链表中的数据恰好是有序的,更适合文件索引系统
B+树的分裂是一个节点满时新增一个新节点,同时把原节点的数据分1/2到新节点,同时在父节点上新增新节点的指针。不会影响兄弟节点
B*树:是B+树的变体,在B+树的非根和非叶节点上增加了兄弟指针
在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2);
B*数一个节点满时,如果他的兄弟节点未满,则将一部分数据转移到兄弟节点中,再在原节点插入关键字,然后修改父节点中兄弟节点的关键字(因为兄弟节点中关键字的范围变了)
如果兄弟节点也满了,则在原节点与兄弟节点之间增加新节点,并各复制1/3的数据到新节点,并在父节点中增加新节点的指针
所以,B*树分配新节点的概率要比B+树低,空间使用率更高
2、哈希表,结构简单,无序,不利于范围搜索,单个索引速度很快(等于)
3、有序数列,单个和范围速度都很快,单位添加或者删除的时候需要移动后面所有数据