MySQL索引优化
1.JOIN语句优化
尽可能减少join语句中的Nested Loop的循环总次数;"永远用小结果集驱动大的结果集"。
优先优化Nested Loop的内层循环。
保证join语句中被驱动表上join条件字段已经被索引。
当无法保证被驱动表的join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer的设置。
2.索引失效(应该避免)
1)全值匹配
2)最左前缀法则
如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
3)不在索引列上做任何操作(计算、函数、自动或手动类型转换(如varchar类型查询时字符串不加单引号索引失效,或隐性的转换类型)),会导致索引失效而转向全表扫描
4)存储引擎不能使用索引中范围条件右边的列

5)尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少使用select *
6)mysql在使用不等于(!=或<>)的时候无法使用索引会导致全表扫描
7)is null, is not null 也无法使用索引
8)like以通配符开头(‘%abc...’),mysql索引失效会变成全表扫描的操作,使用在右边加('aaa%')会走索引,type是range
如何解决like ‘%字符串%’时索引不被使用的方法?
使用覆盖索引(索引列和查询列一致)
9)字符串不加单引号索引失效
10)少用or,用它来连接时会索引失效

3.一般建议
对于单键索引,尽量选择针对当前query过滤性更好的索引
在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好
在选择组合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引
尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的
优化总结
全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
LIKE百分写最右,覆盖索引不写星
不等空值还有OR,索引失效要少用
浙公网安备 33010602011771号