不要在索引上做任何操作
比如,计算,函数,自动或者手动转型,会导致索引失效而转为全表查询。
例如:
EXPLAIN SELECT * FROM employees WHERE left(name,3) = 'LiLei';
会导致全表查询,虽然name上有索引。
可以看到,type为ALL,即全表查询。
那么原因是什么呢?
还是要回想起MySQL的索引表结构,是有序的数据结构,当你取left时,会导致以无序的结构去查有序的索引,那么自然索引是起不到作用的。
有索引也不一定会用
有时候即便可以用索引,MySQL也不一定会用索引,反而会去做全表扫描。例如当数据量很少,而走索引需要回表时,MySQL底层会去做一个预估,来得到最佳方案。如果它发现全表扫描比走索引更快,那么就不会去走索引。
尽量使用覆盖索引,减少select * 语句
覆盖索引就是通过索引可以查到所有我们想要的字段,这样子就可以不用回表。而如果使用select * 那么是需要回表的。
使用不等于!有时候不能使用索引
Like语句视情况而定
如果是左边使用通配符,那么不会走索引:
EXPLAIN SELECT * FROM employees WHERE name like '%Lei'
如果是右边使用通配符,会走索引:
1 EXPLAIN SELECT * FROM employees WHERE name like 'Lei%'
原理同样是因为索引树的结构。
字符串不加单引号会导致索引失效
EXPLAIN SELECT * FROM employees WHERE name = '1000';
EXPLAIN SELECT * FROM employees WHERE name = 1000;
第二行代码会导致索引失效,因为name本来是字符串类型,但是因为没加引号,导致要做一次自动转型,而自动转型则会导致索引失效。
少用or和in, 因为可能会导致索引失效
因为这两个会导致多次扫描索引树,其效率可能会比全局查找更慢。