B+树
B+树是B树的变体,定义基本与B树一致,与B树的不同点:
- 所有叶子节点包含全部关键字信息
- 各叶子节点之间用指针进行连接
- 非叶子节点只存储key的信息,相对B树,可以增加每一页中存储key的数量
- B树是纵向扩展,变成“瘦高个”,B+树是横向扩展的,会变成“矮胖子” 在数据库中B+树的高度一般在2到4层,所以查找某一行数据最多只需要2到4次IO,没有索引情况下需要逐行扫描,明显效率低很多,这就是为什么添加索引能提高查询效率。
B+树索引
聚集索引
InnoDB的数据是按照主键顺序存放的,而聚集索引是按照每张表的主键构造一颗B+树,它的叶子节点存放的是整行数据。 InnoDB的主键一定是聚集索引,如果没有定义主键,聚集索引可能是第一个不允许为null的唯一索引,或者是rowid。 聚集索引对主键的排序操作和范围查找速度非常快。
- 根据主键创建B+树结构
- 每个叶子节点包含整行数据
辅助索引
InnoDB存储引擎辅助索引的叶子节点不会存放整行数据,存放的是键值和主键ID. 当通过辅助索引查找数据时,InnoDB存储引擎会遍历索引树查找到对应记录的主键,通过主键索引来找到对应的数据。 辅助索引的查询比主键索引查询多扫描一颗索引树,尽量使用主键作为条件进行查询。
Btree索引可能需要多次运用折半查找来找到对应的数据块(对比跟节点-子树-叶子节点-数据 块);而HASH索引是通过HASH函数,计算出HASH值,在表中找出对应的数据。优缺点对 比:大量不同数据等值精确查询,HASH索引效率通常比B+TREE高。但是HASH索引不支持模 糊查询、排序、范围查询和联合索引中的最左匹配规则,而这些Btree索引都支持。
常见需要添加索引的场景:
- 数据检索时在条件字段添加索引
- 聚合函数对聚合字段添加索引
- 对排序字段添加索引
- 为了防止回表添加索引
- 关联查询在关联字段添加索引
Btree 索引和 HASH 索引有什么区别
区别:
- Btree 索引可能需要多次运用折半查找来找到对应的数据库;
- 而 HASH 索引是通过 HASH 函数,计算出 HASH 值,在表中找出对应的数据。
优缺点对比:
- 大量不同数据等值精确查询,HASH 索引效率通常比 B+TREE 高;
- 但是 HASH 索引不支持模糊查询、排序、范围查询和联合索引中的最左匹配原则,而这些 Btree 索引都支持。