作者:dijia478

来源:https://www.cnblogs.com/dijia478/p/11550902.html


一、问题背景

现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下:我在测试环境构造了500万条数据,模拟了这个慢查询。简单来说,就是查询一定条件下,都有哪些用户的。很简单的sql,可以看到,查询耗时为37秒。说一下app_account字段的分布情况,随机生成了5000个不同的随机数,然后分布到了这500万条数据里,平均来说,每个app_account都会有1000个是重复的值,种类共有5000个。


二、看执行计划

可以看到,group by字段上我是加了索引的,也用到了。


三、优化

说实话,我是不知道该怎么优化的,这玩意还能怎么优化啊!先说下,下面的思路都是没用的。

思路一:

后面应该加上 order by null;避免无用排序,但其实对结果耗时影响不大,还是很慢。

思路二:

where条件太复杂,没索引,导致查询慢,但我给where条件的所有字段加上了组合索引,也还是没用。搜索并关注微信公众号码匠笔记回复面试,获取经典面试资料汇总。

思路三:

既然group by慢,换distinct试试??(这里就是本篇博客里说的神奇的地方了)卧槽???!!!这是什么情况,瞬间这么快了??!!!虽然知道group by和distinct有很小的性能差距,但是真没想到,差距居然这么大!!!大发现啊!!


四、你以为这就结束了吗

我是真的希望就这么结束了,那这个问题就很简单的解决了,顺便还自以为是的发现了一个新知识。但是!这个bug转给测试后,测试一测,居然还是30多秒!?这是什么情况!!???我当然是不信了,去测试电脑上执行sql,还真是30多秒。。。我又回我的电脑上,连接同一个数据库,一执行sql,0.8秒!?什么情况,同一个库,同一个sql,怎么在两台电脑执行的差距这么大!后来直接在服务器上执行:醉了,居然还是30多秒。。。。那看来就是我电脑的问题了。后来我用多个同事的电脑实验,最后得出的结论是:是因为我用的SQLyog!哎,现在发现了,只有用sqlyog执行这个“优化后”的sql会是0.8秒,在navcat和服务器上直接执行,都是30多秒。那就是sqlyog的问题了,现在也不清楚sqlyog是不是做什么优化了,这个慢查询的问题还在解决中(我觉得问题可能是出在mysql自身的参数上吧)。这里只是记录下这个坑,sqlyog执行sql速度,和服务器执行sql速度,在有的sql中差异巨大,并不可靠。搜索并关注微信公众号码匠笔记回复面试,获取经典面试资料汇总。


五、后续(还未解决)

感谢大家出谋划策,我来回复下问题进展:1.所谓的sqlyog查询快,命令行查询慢的现象,已经找到原因了。是因为sqlyog会在查询语句后默认加上limit 1000,所以导致很快。这个问题不再纠结。2.我已经试验过的方法(都没有用):①给app_account字段加索引。②给sql语句后面加order by null。③调整where条件里字段的查询顺序,有索引的放前面。④给所有where条件的字段加组合索引。⑤用子查询的方式,先查where条件里的内容,再去重。测试环境和现网环境数据还是有点不一样的,我贴一张现网执行sql的图(1分钟。。。):


六、最终解决方案

感谢评论里42楼的@言枫大佬!经过你的提醒,我确实发现,explain执行计划里,索引好像并没有用到我创建的idx_end_time。然后果断在现网试了下,强制指定使用idx_end_time索引,结果只要0.19秒!至此问题解决,其实同事昨天也在怀疑,是不是这个表索引建的太多了,导致用的不对,原本用的是idx_org_id和idx_mvno_id。现在强制指定idx_end_time就ok了!最后再对比下改前后的执行计划改之前(查询要1分钟左右):改之后(查询只要几百毫秒):

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

怎么会执行sql 懒加载 没用_太神奇的 SQL 查询经历,group by 慢查询优化!相关推荐

  1. java懒加载注解_在springboot中实现个别bean懒加载的操作

    懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. @Lazy 在需要懒加载的bean上加上@Lazy ...

  2. 代码中避免懒加载错误_网站设计中应避免的5大错误

    代码中避免懒加载错误 The design of a website plays an imperative role in creating an effective and impressive ...

  3. sql文件加载出错_四十二、SparkSQL通用数据源加载(load)和保存(save)

    SparkSQL能用数据加载(load)和保存(save) 对于Spark SQL的DataFrame来说,无论是从什么数据源创建出来的DataFrame,都有一些共同的load和save操作.loa ...

  4. mybatis 的懒加载原理

    断断续续的阅读 mybatis 的源码有好几个月了,想把自己了解到的一些东西与大家分享.今天给大家分享一下 mybatis 的懒加载原理. mybatis 的懒加载过程挺复杂的,涉及到的东西有很多,包 ...

  5. JPA/hibernate懒加载原理分析及JSON格式API反序列化时连环触发懒加载问题的解决

    什么是懒加载 JPA是java持久层的API,也就是java官方提供的一个ORM框架,Spring data jpa是spring基于hibernate开发的一个JPA框架.Spring data j ...

  6. Hibernate懒加载解析

    Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...

  7. Hibernate懒加载

    在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而 ...

  8. SpringBoot JPA 懒加载的问题 ---No session

    当前项目中使用的orm框架为 JPA,其所使用的实现类是以Hibernate为基础的: 问题描述: 代码逻辑大致如下 public class EntiryA{int a;int b;String c ...

  9. hibernate的懒加载(延迟加载)问题

    hibernate的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载的问题,在实体映射中多对一和多对多中,多的一方的属性默认是lazy="true"(即,默认是延迟加载) ...

最新文章

  1. 字节跳动《Python高频面试题》火了,完整版 PDF 开放下载!
  2. python自动化测试看什么书-Python自动化测试入门,看这一篇就足以
  3. java文本输入输出小结
  4. ASP.NET MVC动态加载数据
  5. 打印速度快点的打印机_SLM推出了功能强大的新型金属3D打印机,速度快20倍
  6. 华为正准备发布属于自己的手机操作系统;腾讯已经交出了首张产业互联网成绩单……...
  7. 潮流仿真分析matlab,基于MATLAB的电力系统潮流仿真与研究
  8. 非递归中序遍历---算法导论12.1-3
  9. C++Debug Assertion Failed!到底出错在哪里?
  10. 基于springboot+vue的医院预约系统(前后端分离)
  11. C语言程序书写中 每行必须有分号,石家庄铁道大学C语言程序设计习题集.pdf
  12. 使用matplotlib绘制K线图以及和成交量的组合图
  13. 键盘映射keybmap工具使用
  14. wake on LAN: 三分钟实现从Linux和Windows设备上远程唤醒设备
  15. 《如何阅读一本书》完整版读书笔记
  16. 聚合数据API接口调用方法
  17. mysql的全文搜索功能
  18. 微前端 - micro-app 数据通信
  19. 【C4-AI大赛】2021优秀作品荟
  20. 到期日计算,账龄报表

热门文章

  1. mysql数据库恢复数据_【技术分享】使用Innodb存储引擎的mysql数据库恢复
  2. Linux 下的网络配置
  3. Java 中JProgressBar,Java JProgressBar
  4. 阿里云MVP第14期全球发布:云时代2.0,遇见科技追梦者!
  5. 还在为系统迁移烦恼?掌握这些“基本法”解锁更多可能
  6. 在地理文本处理技术上,高德有哪些技巧?
  7. 游戏编程设计模式-state
  8. proxy error: could not proxy request解决方案
  9. 详解计算机内部存储数据的形式 二进制数
  10. Win7 64位下PowerDesigner连接64位Oracle11g数据库