«

MySQL索引优化

时间:2023-2-27 22:01     作者:wen     分类: MySQL


  1. 全值匹配我最爱
    创建一个name、age、pos的复合索引
    复合索引匹配1
    复合索引匹配2
    上面3条SQL都使用了索引。条件精度越高,key_len越大

  2. 最佳左前缀法则
    复合索引匹配3索引失效
    上面2条SQL索引失效,如果索引多列,要遵守最最前缀法则。指的是查询从索引的最左前列开发并且不跳过索引中的列。
    复合索引匹配4
    这条SQL虽然使用了索引,但是第二个条件没有用到索引(用到key_len为78以上,ref为2个const,可以参照上边全值匹配我最爱的SQL,key_len、ref)
    explan各个字段的解释:MySQL索引

  3. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
    索引列使用函数
    对比发现第2条使用left函数导致全表扫描

  4. 存储引擎不能使用索引中范围条件右边列
    复合索引匹配5使用范围查询
    age使用范围查询,age用到了索引,但是age右边的索引全都会失效

  5. *尽量使用覆盖索引(只访问索引的查询(索引列查询一致)),减少select **
    复合索引匹配6覆盖索引_0
    下面一种的性能会更加的优秀

  6. mysql 在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
    复合索引匹配6使用不等于

  7. is null , is not null 也无法使用索引
    复合索引匹配6使用is null

  8. like 以通配符开头('%abc...%')mysql索引失效会变成全表扫描的操作
    复合索引匹配7使用like

解决like"%字符串%"时索引不被使用的方法??

用覆盖索引可以解决这个问题(select id, name,age,pos from staffs where like '%july%'),id是主键索引,查询的字段要是复合索引上的字段,可以少,不能多,多了就会索引失效

  1. 字符串不加单引号索引失效
    复合索引匹配8加单引号
    MySQL varchar类型必须交单引号,不加虽然能查到数据,但是MySQL会隐式的转换数据类型,就会发生第3条,导致索引失效

  2. 少用or,用它来连接时会索引失效
    复合索引匹配9使用or

总结:带头大哥不能死,中间兄弟不能断,索引列上不计算,like百分加右边,范围右边全失效,字符串里有引号。

一般性建议:

  1. 对于单键索引,尽量选择针对前期query过滤性更好的索引
  2. 在选择组合索引的时候 ,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。
  3. 在选择组合索引的时候,尽量选择可以能够包含当前query中where字句中更多字段的索引
  4. 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。

标签: mysql优化