- 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