数据结构优化索引基础知识(B-Tree、B+-Tree、hash、密集索引和稀疏索引的区别)

  • B-Tree定义
    1、根节点至少包括两个孩子
    2、树中每个节点最多含有m个孩子(m≥2)
    3、除根节点和叶节点之外,其他每个节点至少含有ceil(m/2)个孩子
    4、所有的叶子节点都位于同一层
  • B±Tree定义
    其定义基本与B-Tree相同
    除了:
    1、非叶子节点的子树指针与关键字个数相同。
    2、非叶子节点的子树指针p[i],指向关键字值(K[i],K[i+1])的子树。
    3、非叶子节点仅用来做索引,数据都保存在叶子节点中。
    4、所有叶子节点均有一个链指针指向下一个叶子节点。

B+树更适合用来做存储索引
1、B+树的磁盘读写代价更低
2、B+树的查询效率更加稳定
3、B+树更有利于对数据库的扫描(B树提高了磁盘IO性能问题,并没有解决元素遍历效率低下的问题。B+树,只需要遍历叶子节点,就可以解决对全部关键字信息的扫描。)

  • Hash索引
    缺点:
    1、仅仅能满足“IN”、“=”,不能使用范围查询
    2、无法被用来避免数据的排序操作
    3、不能利用部分索引键查询
    4、不能避免表扫描
    5、遇到大量Hash值相等的情况后性能不一定就会比B-树索引高

通常的索引就是B+树,比较小众的就是Hash和BitMap(适用于字段值只是固定的几个,用0/1存。锁很严重,因为某行修改都会锁)。

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

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

  • InnoDB
    若一个主键被定义,该主键则作为密集索引。
    若没有主键被定义,该表的第一个唯一非空索引则作为密集索引。
    若不满足以上条件,InnoDB内部会生成一个隐藏主键(密集索引)。
    非主键索引存储相关键位和其对应的主键值,包含两次查找。

表结构存储在*.frm中
MyISAM索引和数据是分开存储的
*.MYI存储索引
.MYD存储数据
InnoDB索引和数据是存在一起的
.ibd

猜你喜欢

转载自blog.csdn.net/qq_37873484/article/details/87861065