Mysql的索引

1、B-Tree 索引

Mysql的大部分存储引擎都支持这种索引类型,它是一个平衡树(任何一个叶子结点最短路径长度都相等)。我们经常使用的Innodb 是经过改良的B-Tree,通常叫做B+Tree。

  • B-Tree 结构

Mysql的索引_第1张图片

  • B+Tree 结构

Mysql的索引_第2张图片

对比

B-Tree 中我们的每个节点,既存储了主键,也存储了数据,但是我们的树节点存储固定大小(默认为16KB),所以B+Tree相对B—Tree树的高度矮,自然检索起来就快。

2、Hash 索引

MySQL中只有Memory引擎显示支持哈希索引。 NDB集群引擎支持唯一哈希索引。

缺点:

  1. 索引只包含哈希值和行指针
  2. 没有按照顺序存储,无法排序
  3. 不支持部分索引列匹配查找
  4. 只支持等值比较查询,包括=、IN()、<=>,不支持范围查询
  5. 冲突越大,查询代价越大

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的标识),不需要回表!

你可能感兴趣的:(数据库)