MYSQL索引优化与查询优化的三个思考维度

我们在谈mysql索引优化的时候,实际上更多地是在侧重查询效率的优化,因为我们知道索引解决的最大问题就是:提高数据的查询效率。当然使用索引也可避免表级锁

那我们在谈优化的时候,虽然策略很多,各种技巧,但是总结下来,主要是从以下几个维度进行考虑

1)索引树上存储的是我们具体的字段值,这就要求:我们在进行查询的时候,不要给索引字段加函数,也不要进行数据的隐式转换,这都会导致无法使用索引

2)索引树的有序性,要求我们,在进行数据查询比对的时候,需要符合最左前缀原则,一旦遇到不符合该原则的字段则停止索引的使用

同时,在有序性上,还要求我们要考虑order by语句的性能调优,mysql的排序是一件成本高的事情,如果能利用索引树本身的有序性,则能大大提高性能,比如 where a=xxx order by b ,如果正好有ab类的联合索引,则这个时候查询的记录已经是有序的了,对于多列的排序,顺序要求不一致的时候,mysql8.0已支持降序索引了

3)二级索引树上叶节点存储的是主键的值,这个告诉我们,在进行数据查询的时候,mysql根据二级索引树进行数据筛选后,还会进行回表拿数据

当然,如果查询的数据已经在索引树上了,那么就无需回表了,这个叫做覆盖索引查询,这里要注意的是,主键也在二级索引树上,所以覆盖索引也包含主键。这个要求我们,在查询的时候,不要出现无需查询的字段,能利用覆盖索引则最好,当然,你也不要为了使用索引覆盖而去把涉及到的字段都建立联合索引,这个要根据具体业务具体分析,要知道索引本身也是有维护成本的。

同时对于一些查询,虽然建立了索引,但是使用explain的时候看到mysql还是使用了全表扫描,这是因为基于成本考虑,对于返回数据量较大的情况下,即使使用了索引,但由于还要回表查询,还不如直接进行全表扫描。

其次,在where条件有多个的情况下,在需要回表的时候可能还需要进行数据筛选,但是对于where条件中有索引的字段,直接在索引扫描的时候就可以根据索引树上的值进行筛选了,这个叫做索引下推

以上,我们是从三个维度思考索引优化,明白这些之后,再去看一些索引优化策略,便明白其出发点了。但是在实际索引的建立过程中,还是要结合自身业务进行分析。

MYSQL索引优化与查询优化:https://edu.csdn.net/course/detail/29460

MYSQL常见场景下的查询实战:https://edu.csdn.net/course/detail/29450

MYSQL事务隔离与锁:https://edu.csdn.net/course/detail/30120

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

njkd5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值