一、索引优化

1、全值匹配我最爱

结论:全职匹配我最爱指的是,查询的字段按照顺序在索引中都可以匹配到
SQL 中查询字段的顺序,跟使用索引中字段的顺序,没有关系。优化器会在不影响 SQL 执行结果的前提下,给你自动地优化。

2、最佳左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
查询字段与索引字段顺序的不同会导致,索引无法充分使用,甚至索引失效!
原因:使用复合索引,需要遵循最佳左前缀法则,即如果索引了多列,要遵守最左前缀法则。指的是查询从索 引的最左前列开始并且不跳过索引中的列(中间兄弟不能断)。
结论:过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。

3、不要在索引列上做任何操作

不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。

4、存储引擎不能使用索引中范围条件右边的列

建议:将可能做范围查询的字段的索引顺序放在最后

5、尽量使用覆盖索引

只访问索引的查询(索引列和查询列一致)减少select *。

6、mysql在使用不等于(!=或<>)的时候无法使用索引会导致全表扫描

7、is null,is not null也无法使用索引。

例外:

不过,当字段允许为 Null 的条件下:is not null 用不到索引,is null 可以用到索引。

8、like以通配符开头(‘%abc’),mysql索引失效会变成全表扫描的操作。

前缀不能出现模糊匹配(因为会导致索引失效),不过后缀可以出现模糊匹配(因为不会导致索引失效)

问题:解决like “%字符串%”时索引不被使用的方法

使用覆盖索引

9、字符串不加单引号索引会失效

varchar类型一定不能失去单引号

10、少用or,用它来连接时会索引失效

使用 union all 或者 union 来替代。

11、口诀

全职匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE 百分写最右,覆盖索引不写*;
不等空值还有 OR,索引影响要注意;
VAR 引号不可丢,SQL 优化有诀窍。