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,索引失效要少用

posted @ 2021-02-19 14:54  学习大数据入门到放弃  阅读(86)  评论(0)    收藏  举报