MySQL复合索引(联合索引)原理分析及使用

MySQL索引分类

  1. 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据。在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。

  2. 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行。在InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。

复合索引

MySQL可以在多个列上建立索引,这种索引叫做复合索引,是一种非聚簇索引。复合索引的使用原则:

  1. 最左前缀原则:在复合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

  2. 覆盖索引:SQL只需要通过索引就可以返回查询所需要的数据,而不必通过非聚簇索引查到主键之后再去查询数据,避免二次查找。

举个栗子,假设表有4个列:

id, name, age, sex

主键id,普通索引(name,age),那么在InnoDB里实际上包含2个索引(即2个B+树):

id -> (name, age, sex); // 主索引,每个InnoDB的表必然包含一个主索引,主索引必然包含所有的列
(name, age) -> id; // 普通索引(name, age)

我们执行查询:

SELECT id FROM table WHERE name = ? AND age = ?

只要使用(name,age)索引就可以了,不会再使用主索引。但如果查询是:

SELECT id, sex FROM table WHERE name = ? AND age = ?

先使用(name,age)索引查到 id 后,再会查主索引查到 sex,所以会比刚才多查一次,二次查找。

可以将索引(name,age)改为(name,age,sex),这样查(name,age)可以直接查到 id 和 sex,不需要再查主索引了。

你可能感兴趣的:(MySQL)