MySQL优化之常见误区

在公司面试新同学的时候,常常会问他们一些关于MySQL索引优化的问题,下面是我根据面试的回答,简单整理的一些误区(将持续更新)。

误区1:like用不到索引

一般我们认为,%百分号不在左边是可以用到索引的,否则MySQL会全表扫描,如下面的SQL是可以用到索引的(下面例子都是假设a字段是索引字段)
select * from table where a like "a%";
但是有时候项目中必须要把like放到左侧,那么有没有办法用到索引呢?答案是有
select a from table where a like "%a%";
仔细看这两条SQL的区别,把*替换成了索引字段,这就是覆盖索引,MySQL会从索引中检索,而不用回表查,将大大加快查询速度。
我们已经知道覆盖索引可以使like操作用到索引,那么,下面的SQL可以用到索引吗?(id是主键)
select id from table where a like "%a%";
在innodb中,这样的SQL是可以用到索引的,但是在myisam中是不可以的,因为innodb的索引字段上,存储了主键,myisam的索引,存储的是数据的指针。

误区2:联合索引的字段查询必须从左至右依次匹配

假如a,b,c三个字段是联合索引,很多人都认为必须这样查询
select * from table where a = 1 and b = 2 and c = 3;
那么如果我写成
select * from table where c = 3 and b = 2 and a = 1;
可以用到索引吗?
答案是可以的,因为MySQL其实有自己的查询优化器,他会帮助你在一定的程度上优化SQL。