目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构

B-树

mysql索引的数据结构
B-树是一种多路搜索树,其特点是:

  • 关键字分布在整棵树中
  • 任何一个关键字出现且只出现在一个节点中
  • 搜索有可能在非叶子节点中结束
  • 搜索性能等价于在关键字全集内做一次二分查找
  • 具有自动层次控制
    • B树中每一个内部节点会包含一定数量的键值。通常,键值的数量被选定在d和2d之间。在实际中,键值占用了节点中大部分的空间。因数2将保证节点可以被拆分或组合。如果一个内部节点有2d个键值,那么添加一个键值给此节点的过程,将会拆分2d键值为2个d键值的节点,并把此键值添加给父节点。每一个拆分的节点需要最小数目的键值。相似地,如果一个内部节点和他的邻居两者都有d个键值,那么将通过它与邻居的合并来删除一个键值。删除此键值将导致此节点拥有d-1个键值;与邻居的合并则加上d个键值,再加上从邻居节点的父节点移来的一个键值。结果为完全填充的2d个键值。

B-树的搜索:从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;

B+树

mysql索引的数据结构
B+树是B树的一个变种,mysql使用的就是B+树实现索引结构
B+树的特点有:

  • 非叶子节点的子树指针与关键字的个数相同
  • 所有叶子节点连接成为一个单链表,且这个链表是有序的
  • 所有关键字都在叶子节点出现,因此不可能在非叶子节点命中
  • 内节点不存数据,只存key
  • 非叶子节点相当于是叶子节点的索引,叶子节点相当于是存储数据的数据层
  • 适合文件索引系统()

索引一般以文件形式存储在磁盘上,索引检索需要磁盘I/O操作,由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。
在数据库中,B-Tree的一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。

MyISAM索引的实现:
mysql索引的数据结构

相关文章: