MySQL----覆盖索引

文章目录


请添加图片描述
请添加图片描述

尽量使用覆盖索引,减少select *。

覆盖索引:
指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。

explain select id, profession from tb_user where profession = '软件工程' and age = 31 and status = '0' ; 

MySQL----覆盖索引_第1张图片

explain select id,profession,age, status from tb_user where profession = '软件工程' and age = 31 and status = '0' ; 

MySQL----覆盖索引_第2张图片

explain select id,profession,age, status, name from tb_user where profession = '软 件工程' and age = 31 and status = '0' ; 

MySQL----覆盖索引_第3张图片

explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';

MySQL----覆盖索引_第4张图片
关注Extra,前面两条SQL的结果为 Using where; Using Index ; 而后面两条SQL的结果为: Using index condition 。

Extra 含义
Using where; Using Index 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
Using index condition 查找使用了索引,但是需要回表查询数据

在 tb_user 表中有一个联合索引 idx_user_pro_age_sta,该索引关联了三个字段 profession、age、status,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主键id。 所以当我们查询返回的数据在 id、profession、age、status 之中,则直接走二级索引直接返回数据了。

如果超出这个范围,就需要拿到主键id,再去扫描聚集索引,再获取额外的数据,这个过程就是回表。

而我们如果一直使用select * 查询返回所有字段值,很容易就会造成回表查询(除非是根据主键查询,此时只会扫描聚集索引)。

MySQL----覆盖索引_第5张图片
id是主键,是一个聚集索引。 name字段建立了普通索引,是一个二级索引(辅助索引)。

select * from tb_user where id = 2;

根据id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。

MySQL----覆盖索引_第6张图片

selet id,name from tb_user where name = 'Arm';

虽然是根据name字段查询,查询二级索引,但是由于查询返回在字段为 id,name,在name的二级索引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。

MySQL----覆盖索引_第7张图片

selet id,name,gender from tb_user where name = 'Arm';

由于在name的二级索引中,不包含gender,所以,需要两次索引扫描,也就是需要回表查询,性能相对较差一点。
MySQL----覆盖索引_第8张图片

思考题:
一张表, 有四个字段(id, username, password, status), 由于数据量大, 需要对以下SQL语句进行优化, 该如何进行才是最优方案:

select id,username,password from tb_user where username = 'itcast';

针对于 username, password建立联合索引, sql为:

 create index idx_user_name_pass on tb_user(username,password);

这样可以避免上述的SQL语句,在查询的过程中,出现回表查询。

你可能感兴趣的:(MySQL,mysql,sql,MySQL,SQL,数据库)