索引下推:例如select * from T where name like ‘张%’ and age=10 and isMal=1;这个表有一个(name,age)的索引,mysql5.6之前是没有索引下推的,查找过程是先找到name是张的找到对应的主键,回表找到行数据比对age和isMal字段;但是有索引下推优化就可以减少回表的次数了,当根据(name,age)索引找到对应的数据时,可以先感觉age判断一下,如果不满足情况就不需要回表操作了,可以减少查询的次数,达到优化sql的目的
索引优化删除多余索引分析
CREATE TABLE `geek` (
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
`d` int(11) NOT NULL,
PRIMARY KEY (`a`,`b`),
KEY `c` (`c`),
KEY `ca` (`c`,`a`),
KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;
我们还是以市民表的联合索引(name, age)为例。如果现在有一个需求:检索出表中“名字第一个字是张,而且年龄是 10 岁的所有男孩”。那么,SQL 语句是这么写的:mysql> select * from tuser where name like ‘张%’ and age=10 and ismale=1; 你已经知道了前缀索引规则,所以这个语句在搜索索引树的时候,只能用 “张”,找到第一个满足条件的记录 ID3。当然,这还不错,总比全表扫描要好。(为什么不走联合索引?是因为名字用了like?)