MySQL复合索引示例

-- auto-generated definition
create table test
(
    id    int      not null
        primary key,
    name  char(30) not null,
    local char(30) not null,
    age   int      null
);

create index test_name_local_age_index
    on test (name, local, age);

explain参数参考

https://blog.csdn.net/weixin_35973945/article/details/124128677https://blog.csdn.net/weixin_35973945/article/details/124128677

ref:只会读取匹配的行,当查询的列是一个索引的最左前缀或者是一个普通索引(不是主键索引或唯一索引)会使用 ref。即仅仅会查询几行。

index: 连接类型与 all 相同,除了是扫描索引树外。主要有如下两种方式:

  • 如果查询的索引时覆盖索引,并且满足要从该表中查询的数据需求,则仅扫描索引树。在这种情况下,Extra 列为 Using index索引扫描仅仅会比 ALL 快,因为索引树通常小于整个表
  • 通过对索引的读取进行全表扫描,以按照索引顺序查找数据行,Using index 不会出现在 Extra 列。
explain select * from test where name = '1' and local = '1' and age = 1;

 符合最左匹配原则,通过explain执行结果可以看到type = ref,key使用了联合索引

explain select * from test where name = '1' and age = 1 and local = '1';

 

可以看到跟第一个执行结果一致,这是因为SQL语句经过优化器优化之后,依然符合最左匹配原则

explain select * from test where local = '1' and age = 1;

虽然不符合最左匹配原则,但是发现还是使用了索引,这是因为建表语句一共四个字段,除了主键其他的字段组成联合索引,就意味着表里面的所有数据都能在联合索引里面找到,如果增加一个字段重新执行就会发现全表扫描了。

-- auto-generated definition
create table test
(
    id     int         not null
        primary key,
    name   char(30)    not null,
    local  char(30)    not null,
    age    int         null,
    e_mail varchar(50) null
);

create index test_name_local_age_index
    on test (name, local, age);

可以看到type = ALL,extra信息里面没有using index

你可能感兴趣的:(MySQL,mysql)