覆盖索引
【举栗】
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');
在这个过程中,回到主键索引树搜索的过程,我们称为回表。
二级索引查询结果仅仅是主键 此时不需要回表查主键索引 称为覆盖索引 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
最左前缀原则
(name,age)索引示意图
索引项是按照索引定义里面出现的字段顺序排序的 联合索引(A, B)意味着不需要建立A的索引了,因为这个联合索引意味着建立了(A,B)和(A)这两种索引 如果单使用age作为条件,索引是不会生效的,除非单独建立一个age索引,因为它遵循最左原则
索引下推
mysql> select * from tuser where name like '张%' and age=10 and ismale=1;
MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
无索引下推执行流程
索引下推执行流程