OrderBy 和Select的错误使用导致的慢sql——一次问题排查记录

本文记录了一次由于OrderBy和Select使用不当引发的Mysql慢查询问题。文章介绍了Mysql中的三星索引概念,并详细分析了执行计划错误选择主键索引而非预期的用户索引导致的性能下降。通过调整Order by条件,避免了索引冲突,显著提升了查询速度。总结中强调了理解索引工作原理和避免索引冲突的重要性。
摘要由CSDN通过智能技术生成

引言

使用Mysql的时候,我们总会通过设置索引来提高查询效率,但是在某些情况下,即便索引存在,也可能会由于数据量的变化而导致我们预期的索引不生效,笔者遇到了这样的问题。不同数据量下执行计划使用的索引不一样,而索引的差异则导致了最终查询时间的巨大差异。

本文分为三部分,第一部分简单回顾一下Mysql中非常有名的“三星索引”,第二部分则是具体描述笔者遇到的问题,第三部分则会提出具体的解决方案以及方法建议。

Mysql中的三星索引

  • 索引将相关的记录放到一起获得一星
    没有必要为where中的每一条件单独建立索引,可以把条件中的多列一起形成一个组合索引。

  • 如果索引中的数据顺序和查找中的排列顺序一致获得两星
    order by 中的列,与where条件中的列,都存在于索引中,且order by 的列为最前列(索引第一前缀)。

  • 如果索引中的列包含了查询中需要的全部列则获得三星
    索引中的列包含了查询中需要的全部列。同时,将易变的列变在最后。这样索引包含查询所需要的数据列,不再进行回表查询。这样的索引效率是极高的。

    简单点来说,也就是这样一个sql

    select columnA, columnB from T_Test where columnA in () order by columnA,如果我们在ColumnA, ColumnB上存在一个组合索引,那么这就是一个三星索引。

    通过三星索引,我们也能够明白一件事情——一个Sql只能使用一个索引,如果order by和where条件中的列不一致,则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值