mysql 存在索引但不能使用索引的典型场景

  1. 以%开头的LIKE查询不能够利用B-tree索引
  2. 数据类型出现隐式转换
  3. 复合索引的情况下,查询条件不满足索引最左的原则
  4. 用or分割开的条件,or前条件有索引,or后的列没有索引,那么涉及的索引不会被用到,因为or后面的条件没有索引,那么后面的查询肯定要进行全表扫描,在存在全表扫描的情况下,就没有必要多一次索引扫描增加IO访问。意思就是使用or要用上索引,要求使用的所有字段,都必须建立索引
  5. 负向查询(not , not in, not like, <>, != ,!>,!< ) 不会使用索引
  6. 独立的列索引不能是表达式(计算、函数、类型转换)的一部分,例如:
    select * from xxxx where id+1;

口诀

  1. 全值匹配我最爱,最左前缀要遵守
  2. 带头大哥不能死,中间兄弟不能断
  3. 索引列上少计算,范围之后全失效
  4. LIKE符号写最右,覆盖索引不写星
  5. 不等空值还有or,索引失效要少用
  6. var引号不能丢,SQL高级也不难
  7. 分组之前必排序,一定要上索引啊

建索引注意事项

  1. 单值索引,尽量选择过滤性更好的字段,例如:类型(只有0和1),过滤度为50%,识别率很差,不建议建索引
  2. 组合索引,索引字段的顺序可以按照识别度进行排序,识别度越高,放在越靠前
  3. 组合索引,尽量包含where语句中的更多字段
  4. 尽可能的根据分析执行计划、统计信息,去调整query的写法达到合适索引的目的
  5. 总结:满足以下条件的字段,才应该创建索引.
    • 肯定在where条件经常使用
    • 该字段的内容不是唯一的几个值(例如type,只有0和1)
    • 字段内容不是频繁变化.