• 什么情况下要用索引

    • 主键自带主键索引
    • 唯一约束自带唯一索引
    • 外键自带外键索引
    • 查询条件用到的字段需要
    • 排序用的的字段
    • 分组用到的字段
  • 什么情况下不能用索引

    • 数据量较少时不用建索引。
    • 频繁更新字段不能建索引
    • 索引的选择性(字段的值尽量复杂且尽量分布不平均)
    • where 条件查询用不到的字段不用建索引

mysql 优化索引十诫(附口诀)

  • 全值匹配我最爱
  • 最佳左前缀法则(如果索引引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列)
  • 不在索引列上做任何操作(计算,函数,(自动 or 手动)类型转换),会导致索引失效而转向全表扫描
  • 存储引擎不能使用索引中范围条件右边的列
  • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少 select *
  • mysql 在使用!=或者<>时候无法使用索引而转向全表扫描
  • is null,is not null 也无法使用索引
  • like 以通配符开头(‘%abc’)mysql 索引失效会变成全表扫描的操作。解决办法:使用覆盖索引
  • 字符串不加单引号导致索引失效
  • 少用 or,用 or 连接时会索引失效

口诀

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


排序使用索引

20210810170647.png