全值匹配我最爱
有单个索引或多个索引适合,选择能全部匹配上的,而不是单个的。
最佳左前缀法则
在写where条件时要想使用联合索引,就必须从左往右写不可跳过,如果跳过索引后面的字段都无法被使用。
- 主键插入顺序,依次递增
如果忽大忽小则会页面分裂,损耗性能。
- 计算、函数、类型转换(自动或手动)导致索引失效走全表扫描
- 范围条件右边的列索引失效
在使用联合索引时,如果中间是id>20这种范围的那么右边索引就用不到了。所以设计联合索引的时候,要把设计范围查询的字段放到最后面,联合索引就可以全部用到了。与where条件写的顺序无关。
- 不等于( != 或者 <>)索引失效,无法找。
- is null 可以使用索引,is not null 无法使用索引,not like 也无法使用索引
所以设计数据表时候就将字段设置为 NOT NULL 约束,INT类型字段默认值为0,子类类型设置为空字符串。
- like以通配符%开头索引失效
- OR 前后存在非索引列,索引失效
- 数据库**和表的字符集统一使用utf8mb4,如果字符转换则索引失效**
建议:
- 对于单列索引,尽量选择针对当前query过滤性更好的索引。
- 在选择组合索引时候,当前query中过滤性能最好的字段在索引字段顺序中,位置越靠前越好。
- 在选择组合索引时候,尽量选择能够包含当前query中的where子句中更多字段的索引。
- 在选择组合索引时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面。
- 书写SQL语句,尽量避免造成索引失效的情况。
