不要在索引上做任何操作

比如,计算,函数,自动或者手动转型,会导致索引失效而转为全表查询。
例如:

  1. EXPLAIN SELECT * FROM employees WHERE left(name,3) = 'LiLei';

会导致全表查询,虽然name上有索引。
image.png
可以看到,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, 因为可能会导致索引失效

因为这两个会导致多次扫描索引树,其效率可能会比全局查找更慢。