回表:回到主键索引树搜索的过程。
如何优化索引避免回表过程?
1. 覆盖索引:
mysql> create table T (
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k))
engine=InnoDB;
insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
查询语句select * from T where k between 3 and 5,因为需要查询所有字段信息,所以需要回表查询。但是查询语句
select ID from T where k between 3 and 5,只需要查询ID的值,而k索引树上已经包含了主键ID的值,因此可以直接提供查询结果,不需要回表,这种情况叫做“覆盖索引”。
覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
2. 最左前缀原则:
B+树这种索引结构,可以利用索引的“最左前缀”来定位记录。
(name, age)索引示意图3. 索引下推
Mysql5.6引入了索引下推优化(index condition pushdown),可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
索引下推执行过程在满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一,在使用数据库的时候,尤其是在设计表结构时,也要以减少资源消耗作为目的。
网友评论