mysql高级 --- 索引优化(索引失效)(索引两大功能:查找和排序)

案例


  1. 全职匹配
    在这里插入图片描述
  2. 最佳左前缀法则 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
    在这里插入图片描述
  3. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
    在这里插入图片描述
    在这里插入图片描述
  4. 存储引擎不能使用索引中范围条件右边的列
    在这里插入图片描述
  5. 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  6. mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描
    在这里插入图片描述
  7. is not null 也无法使用索引,但是is null是可以使用索引的
    在这里插入图片描述
  8. like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作
    在这里插入图片描述
    新建一张 tbl_user 表
    explain之后 type都为all在这里插入图片描述
    建立索引在这里插入图片描述
    可以使用覆盖索引,索引不会失效,但当锅盖大于锅口时,索引会失效
    在这里插入图片描述
    在这里插入图片描述
  9. 字符串不加单引号索引失效
    在这里插入图片描述
  10. 少用or,用它来连接时会索引失效
    在这里插入图片描述

总结:

在这里插入图片描述


例题分析

在这里插入图片描述
mysql会在底层自动做一些优化,以最佳的顺序来进行查询
在这里插入图片描述

范围右边全失效,对于第二个,mysql依然会选择最优顺序
在这里插入图片描述
c3 的作用在排序而不再查找
在这里插入图片描述
和c4关系不大
在这里插入图片描述
跨过c3利用c4直接排序,mysql直接做不到,但是它会利用filesort帮助你来完成工作
在这里插入图片描述


难…

1.只用到了c1一个字段的索引,但是c2,c3用于排序,无filesort
在这里插入图片描述

2.出现了filesort,建的索引是1234,它没有按照顺序来,3 2 颠倒了
在这里插入图片描述

3.和上面的结果一样,但是性能不一样
在这里插入图片描述

4.用c1、c2两个字段索引,但是c2、c3用于排序,无filesort
在这里插入图片描述

一般情况下,order by 只要和索引的顺序不一样就会产生filesort
本例有常量c2的情况,和2对比,有常量的情况下,order by c3,c2 就相当于 order by c3,a2 (a2 就是固定的一个,对一个排序等于不排序),到最后就相当于只剩c3一个
在这里插入图片描述

group by 和order by 几乎是一致的(分组之先排序)
在这里插入图片描述
定值(常量),范围(失效),还是排序,一般order by 是给个范围
group by基本上都要进行排序,会有零时表产生


一般性建议:

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

总结

1.观察,至少跑一天,看看生产的慢sql的情况
2.开启慢查询日志,设置阙值,比如超过五秒就是慢sql将它捕获
3.explain+慢sql分析
4.show profile
5.运维经理+DBA,进行Mysql数据库的服务器参数调优

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值