MySQL索引优化
时间:2023-2-27 22:01 作者:wen 分类: MySQL
-
全值匹配我最爱
创建一个name、age、pos的复合索引
上面3条SQL都使用了索引。条件精度越高,key_len越大 -
最佳左前缀法则
上面2条SQL索引失效,如果索引多列,要遵守最最前缀法则。指的是查询从索引的最左前列开发并且不跳过索引中的列。
这条SQL虽然使用了索引,但是第二个条件没有用到索引(用到key_len为78以上,ref为2个const,可以参照上边全值匹配我最爱的SQL,key_len、ref)
explan各个字段的解释:MySQL索引 -
不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
对比发现第2条使用left函数导致全表扫描 -
存储引擎不能使用索引中范围条件右边列
age使用范围查询,age用到了索引,但是age右边的索引全都会失效 -
*尽量使用覆盖索引(只访问索引的查询(索引列查询一致)),减少select **
下面一种的性能会更加的优秀 -
mysql 在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
-
is null , is not null 也无法使用索引
-
like 以通配符开头('%abc...%')mysql索引失效会变成全表扫描的操作
解决like"%字符串%"时索引不被使用的方法??
用覆盖索引可以解决这个问题(select id, name,age,pos from staffs where like '%july%'),id是主键索引,查询的字段要是复合索引上的字段,可以少,不能多,多了就会索引失效
-
字符串不加单引号索引失效
MySQL varchar类型必须交单引号,不加虽然能查到数据,但是MySQL会隐式的转换数据类型,就会发生第3条,导致索引失效 -
少用or,用它来连接时会索引失效
总结:带头大哥不能死,中间兄弟不能断,索引列上不计算,like百分加右边,范围右边全失效,字符串里有引号。
一般性建议:
- 对于单键索引,尽量选择针对前期query过滤性更好的索引
- 在选择组合索引的时候 ,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。
- 在选择组合索引的时候,尽量选择可以能够包含当前query中where字句中更多字段的索引
- 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。
标签: mysql优化