1、B-Tree 索引
Mysql的大部分存储引擎都支持这种索引类型,它是一个平衡树(任何一个叶子结点最短路径长度都相等)。我们经常使用的Innodb 是经过改良的B-Tree,通常叫做B+Tree。
- B-Tree 结构
- B+Tree 结构
对比
B-Tree 中我们的每个节点,既存储了主键,也存储了数据,但是我们的树节点存储固定大小(默认为16KB),所以B+Tree相对B—Tree树的高度矮,自然检索起来就快。
2、Hash 索引
MySQL中只有Memory引擎显示支持哈希索引。 NDB集群引擎支持唯一哈希索引。
缺点:
- 索引只包含哈希值和行指针
- 没有按照顺序存储,无法排序
- 不支持部分索引列匹配查找
- 只支持等值比较查询,包括=、IN()、<=>,不支持范围查询
- 冲突越大,查询代价越大
3、索引策略
- 独立列生效(即查询中不能使用函数包裹列)
- 前缀索引(比如非要使用一个值很长字段作为索引,我们可以这样 alter table tableName add key(field(n)))
- 多列索引的“索引合并”策略(explain 列可以看到,如:index uion merge;index intersect merge ),mysql 5.0后引入,可以优化sql。但是若出现index intersect merge,大部分时间说明索引建的不好,急需要一个联合索引。合并有三种
- union(并集)
- intersection(交集)
- 前2个组合
4、聚簇索引
聚簇索引不是一种单独的索引类型,而是一种数据存储方式。当表中有聚簇索引时,它的数据行实际上存放在索引的叶子页上。术语“聚簇”表示数据行和相邻的键值紧凑地存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引(也就是主键索引)。就像我上面画的B+Tree 图,叶子页包含了行的全部数据,但是节点页只包含了索引列。在InnoDB中默认是通过主键聚簇索引,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。
5、二级索引
二级索引( 除聚簇索引外的其他全部索引类型 )叶子节点保存的不是指向行的物理位置的指针,而是行的主键值。这时候需要回表查询数据所在的行。
6、覆盖索引
如果一个索引包含(或者说覆盖)查询需要的所有字段的值,我们就称之为“覆盖索引”。覆盖索引(explain的Extra列可以看到 Using index的标识),不需要回表!