实例1:复合索引的最佳左前缀原则(where ... order by ...)
创建如下表和索引
CREATE TABLE test03(a1 INT(4) NOT NULL,a2 INT(4) NOT NULL,a3 INT(4) NOT NULL,a4 INT(4) NOT NULL);ALTER TABLE test03 ADD INDEX idx_a1_a2_a3_a4(a1,a2,a3,a4);
看第一种sql语句的执行计划如下:(where 后面的条件与索引顺序一致)
EXPLAIN SELECT a1,a2,a3,a4 FROM test03 WHERE a1=1 AND a2=1 AND a3=1 AND a4=1;
第二种sql语句的执行计划如下:(where 后面的条件与索引顺序不一致)
EXPLAIN SELECT a1,a2,a3,a4 FROM test03 WHERE a4=1 AND a3=1 AND a2=1 AND a1=1;
如上两者的执行计划一模一样,为什么?
因为第二条sql在真正执行前经过了sql优化器的调整,所以与上条保持一致。第一种sql是推荐写法。
再看一个如下sql语句:
EXPLAIN SELECT a1,a2,a3,a4 FROM test03 WHERE a1=1 AND a2=1 AND a4=1 ORDER BY a3;
我们看执行计划的结果:使用了using where,则进行了回表查询,索引失效。以上sql用到了a1,a2两个索引,该两个字段不需要回表查询,因此是using index,而a4因为跨列使用,造成了索引失效,需要回表查询,因此是using where,以上可