数据库之索引数据结构

关系型数据库主要考点

考点思维导图

 

 

一、索引模块

1、常见问题

  • 为什么要使用索引
  • 什么样的信息能够成为索引
  • 索引的数据结构
  • 密集索引和稀疏索引的区别

为什么要使用索引

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值得数据所在的行的物理地址,在数据十分庞大的时候,索引可以大大加速查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。

什么样的信息能够成为索引

  • 主键、唯一键以及普通键等

索引的数据结构

  • 生成索引,建立二叉查找树进行二分查找
  • 生成索引,建立B-Tree结构进行查找
  • 生成索引,建立B+-Tree结构进行查找
  • 生成索引,建立Hash结构进行查找

二叉查找树

二叉查找树是每个节点最多有两个子节点的树结构,通常子树被称为左子树和右子树,左子树的值均小于它的父节点,右子树大于它的父节点。

图一是一个平衡二叉树——其左子树和右子树的高度相差不超过1,其时间复杂度是O(logn)。当出现节点的删除和新增的时候,例如删除节点2和节点6,同时新增节点11和节点13,其树行结构会变成图二,时间复杂度会变成O(n)其性能大大的降低,这也是二叉树的缺点

 

B-Tree(多路搜索树,并不是二叉的)

定义:

  • 根节点至少包括两个孩子
  • 树中每个节点最多含有m个孩子(m>=2)
  • 除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子。(注:ceil函数的意思是向上取整;例如ceil(3/2)=2)
  • 所有叶子节点都位于同一层,即叶子节点的高度都一样的
  • 假设每个非终端节点中包含n个关键字信息,其中
  1. Ki(i=1....n)为关键字,且关键字按顺序升序排序K(i-1)<Ki。
  2. 关键字的个数n必须满足:[ceil(m/2)-1]<=n<=m-1
  3. 非叶子节点的指针:P[1],P[2],....,P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其他P[i]指向关键字属于(K[i-1],K[i])的子树,(注:(K[i-1],K[i])是开区间的)

当数据出现增加和删除时,现有的树结构很有可能会打乱成线性的,由于上述的限制,B-Tree会通过相应策略(合并、分裂、上移、下移节点)保持原有的特征;所以B-Tree的时间复杂度会一直保持在O(logn)

B+-Tree

B+树是B树的变体,其定义基本与B树相同,除了:

  • 非叶子节点的子树指针与关键字个数相同(表明能够存储更多的关键字)
  • 非叶子节点的子树指针P[i],指向关键字值[K[i],K[i-1])的子树
  • 非叶子节点仅用来索引,数据都保存在叶子节点中
  • 所有叶子节点均有一个链指针指向下一个叶子节点,方便用来做统计。

 

 

结论

B+树更适合用来做存储索引

  • B+树的磁盘读写代价更低,因为B+树内部结构并没有指向关键字具体信息的指针,也就是说不存放数据只存放索引信息。
  • B+树的查询效率更加稳定
  • B+树更有利于对数据库的扫描

Hash索引

hash索引就是采用一定的哈希算法,把键值算成新的hash值,检索时不需要像B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

缺点:

  • 仅仅能满足“=”,“IN”,不能使用范围查询
  • 无法被用来避免数据的排序操作,因为hash索引中存放的是hash值,并不是真实的键值。
  • 不能利用部分索引键查询,因为hash是组合索引键合并之后再算的hash值
  • 不能避免表扫描
  • 遇见大量Hash值相等的情况后性能并不一定就会比B-Tree索引高

 

BitMap索引

假如查询列的基数非常的小,即只有固定的几个值,如性别,婚姻情况等,要为这些基数值比较小的列加索引,就需要建立位图索引。

缺点:

  • 支持位图索引的数据库较少
  • 索的粒度非常的大,当新增和修改某一条数据的时候,通常与这条数据在同一个位图的数据操作都会被锁住,所以并不适合高并发。

密集索引和稀疏索引的区别

  • 密集索引文件中的每个搜索码值都对应一个索引值
  • 稀疏索引文件只为索引码的某些值建立索引项

InnoDB

  • 若一个主键被定义,该主键则作为密集索引
  • 若没有主键被定义,该表的第一个唯一非空索引则被作为密集索引
  • 若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)
  • 非主键索引存储相关键位和其对应的主键值,包含两次查找
posted @ 2019-05-26 10:00  许明初  阅读(447)  评论(0编辑  收藏  举报