MySQL索引优化相关
MySQL ⋅
波波文 ⋅
1年前 ⋅
38 点赞 ⋅
1,727 阅读 ⋅
0 评论
mysql 存在索引但不能使用索引的典型场景
- 以%开头的LIKE查询不能够利用B-tree索引
- 数据类型出现隐式转换
- 复合索引的情况下,查询条件不满足索引最左的原则
- 用or分割开的条件,or前条件有索引,or后的列没有索引,那么涉及的索引不会被用到,因为or后面的条件没有索引,那么后面的查询肯定要进行全表扫描,在存在全表扫描的情况下,就没有必要多一次索引扫描增加IO访问。意思就是使用or要用上索引,要求使用的所有字段,都必须建立索引
- 负向查询(not , not in, not like, <>, != ,!>,!< ) 不会使用索引
- 独立的列索引不能是表达式(计算、函数、类型转换)的一部分,例如:
select * from xxxx where id+1;
口诀
全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
LIKE符号写最右,覆盖索引不写星
不等空值还有or,索引失效要少用
var引号不能丢,SQL高级也不难
分组之前必排序,一定要上索引啊
建索引注意事项
- 单值索引,尽量选择过滤性更好的字段,例如:类型(只有0和1),过滤度为50%,识别率很差,不建议建索引
- 组合索引,索引字段的顺序可以按照识别度进行排序,识别度越高,放在越靠前
- 组合索引,尽量包含where语句中的更多字段
- 尽可能的根据分析执行计划、统计信息,去调整query的写法达到合适索引的目的
- 总结:满足以下条件的字段,才应该创建索引.
- 肯定在where条件经常使用
- 该字段的内容不是唯一的几个值(例如type,只有0和1)
- 字段内容不是频繁变化.