一、什么是回表?
就是select所需字段的时候,没有该字段的索引,查询该字段就要回表,去主键索引查询到对应的记录,才能获取该字段的信息。
这就是所谓的 回表查询 ,先定位主键值,再定位行记录,多扫一遍索引树它的性能较低。
(个人通白的理解,该查询的字段没有索引,就会出现回表查询)~~~~0.0
例子:
create TABLE hui_biao (id int not null auto_increment,name varchar(20),age int(11),first_name varchar(20),CONSTRAINT pk_id PRIMARY KEY(id));
create index index_name on hui_biao
(name);
通过执行计划:
explain select id,name from hui_biao
where name = ‘李四’;
explain select name from hui_biao
where name = ‘李四’;
explain select name,age from hui_biao
where name = ‘李四’;
(这一条就查age字段就需要回表查询)
延伸的问题:什么是索引覆盖 (Covering index) ?
只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
解决方法:将被查询的字段,建立到联合索引里去。
延伸的问题:哪些场景可以利用索引覆盖来优化SQL?
场景1:全表count查询优化
原表为:
user(PK id, name, sex);
直接:
select count(name) from user;
不能利用索引覆盖。
添加索引:
alter table user add key(name);
就能够利用索引覆盖提效。
场景2:列查询回表优化
select id,name,sex … where name=‘shenjian’;
这个例子不再赘述,将单列索引(name)升级为联合索引(name, sex),即可避免回表。
场景3:分页查询
select id,name,sex … order by name limit 500,100;
将单列索引(name)升级为联合索引(name, sex),也可以避免回表。
(有所参考,仅供学习)