索引的数据结构
1、什么是索引
在关系型数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单(定义真特么拗口)。 大白话意思是索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
2、能作为索引的数据结构
数组,链表,哈希,红黑树, B树(B+树,B-树);
哈希缺点:只能满足查询条件不变的情况,hash(id)=?,如果有联合索引,比如hash(id,name),只传了id,那么就会索引久会失效,还有不支持范围查找
红黑树缺点:磁盘一页数据可以读16k,可能在查找了3次才能查到自己想要的数据,每一次查找都是读取磁盘,导致读取磁盘次数过多,读取的内容也浪费很多。
b-tree:一个 m 阶的B树满足以下条件:
每个结点至多拥有m棵子树;
除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树;
根结点至少拥有两颗子树(存在子树的情况下);
所有的叶结点都在同一层上,其可以看作是外部结点,不包含任何信息;
有 k 棵子树的非叶子结点则其存在 k-1 个关键码,关键码按照递增次序进行排列;
关键字数量需要满足ceil(m/2)-1 <= n <= m-1;
插入:
如果该结点的关键字个数没有到达m-1个,那么直接插入即可;
如果该结点的关键字个数已经到达了m-1个,那么根据B树的性质显然无法满足,需要将其进行分裂。分裂的规则是该结点分成两半,将中间的关键字进行提升,加入到父亲结点中,但是这又可能存在父亲结点也满员的情况,则不得不向上进行回溯,甚至是要对根结点进行分裂,那么整棵树都加了一层。
b+tree:以一个m阶树为例
根结点只有一个,分支数量范围为[2,m];
分支结点,每个结点包含分支数范围为[ceil(m/2), m];
分支结点的关键字数量等于其子分支的数量;
所有叶子结点都在同一层,其关键字的数量范围为[ceil(m/2), m],从小到达进行排序;