小表驱动大表
防止索引失效:
- 最佳左前缀法则,如果索引中包含多列,要遵守最佳左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列
- 不在索引列上做任何操作(计算、函数、类型转换),会导致索引失效
- 范围或like之后索引失效,当使用联合索引时,如果某个索引使用了范围条件,则之后的条件无法使用索引,例:
banji=13 AND age>13 AND name='a'
联合索引包含(banji、age、name),由于age使用了范围条件,导致之后的name条件失效
同理,like之后的字段页会索引失效
- 尽量使用覆盖索引,减少SELECT *。
- 在非唯一索引列使用不等于(!=、<>)会导致索引失效,全表扫描(在唯一索引列使用不等于不会导致全表扫描,执行计划的type是range)
- is null、is not null会导致索引失效
- 字符串不加单引号,索引会失效
- 以通配符开头的like会导致索引失效,例:name like '%fan'
解决方案:如果一定要以通配符开头,使用覆盖索引可以避免全表扫描
案例:只查询主键和city(如果你想查询更多列,应该创建复合索引)
explain select city_id,city from city where city like '%ade%'