专栏首页DotNet程序园记一次神奇的sql查询经历,group by慢查询优化

记一次神奇的sql查询经历,group by慢查询优化

一、问题背景

现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下:

我在测试环境构造了500万条数据,模拟了这个慢查询。

简单来说,就是查询一定条件下,都有哪些用户的。很简单的sql,可以看到,查询耗时为37秒。

说一下app_account字段的分布情况,随机生成了5000个不同的随机数,然后分布到了这500万条数据里,平均来说,每个app_account都会有1000个是重复的值,种类共有5000个。

二、看执行计划

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

三、优化

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

思路一:

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

思路二:

where条件太复杂,没索引,导致查询慢,但其实哪怕where条件不动,只要把group by去掉,就非常快。所以应该也不是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中差异巨大,并不可靠。

本文分享自微信公众号 - DotNet程序园(dotnetblog),作者:dijia478

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 采用WPF开发截图程序,so easy!

    前言 QQ、微信截图功能已很强大了,似乎没必要在开发一个截图程序了。但是有时QQ热键就是被占用,不能快速的开启截屏;有时,天天挂着QQ,领导也不乐意。既然是程...

    梁规晓
  • 阅读《代码整洁之道》总结-各种技巧分享

    当阅读JDK源码或者其他优秀开源工程时,叹服作者代码构建之精良,他们都有共同的特点:精确的变量名、恰到好处的设计模式、详细而不赘述的注释等等。如今重读本书...

    梁规晓
  • SignalR第一节-在5分钟内完成通信连接和消息发送

    首先声明,这又是一个小白从入门到进阶系列。 SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的...

    梁规晓
  • 第33次文章:SORM框架(三)

    本周将SORM框架的基本功能已经全部填充起来了,形成了SORM框架的1.0版本,有兴趣的同学可以通过下面的链接获取源码哟!下周将进入SORM框架的升级阶段,在现...

    鹏-程-万-里
  • sql格式化工具

    该工具支持oracle、mysql、sql server等关系型数据库,能让你看到sql美化后的清晰的结构,可运用于对复杂SQL语句的分析或者是程序代码优化上,...

    ixiaoyang8
  • Groovy-16.数据库

    UPDATE和DELETE操作都是写好SQL然后通过execute执行,但是需要commit()提交(在后文“提交”中介绍)。

    悠扬前奏
  • 注入学习之sqli-labs-2(第一关)

    前言 从这一节开始,一个个关卡来学习sql注入 从最基础的sql语句开始 环境配置完成后,还有一个步骤需要做,要安装一下sqli数据库,环境配置那节课忘了说了,...

    用户1467662
  • mysql防止网站被sql注入攻击 的3种方法

    mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与s...

    技术分享达人
  • Oracle AWR 阙值影响历史执行计划

          最近有网友提到为什么在dba_hist_sql_plan中无法查看到sql语句的历史执行计划,对于这个问题是由于缺省情况下,Oracle 设定的阙值...

    Leshami
  • 针对plsql developer使用做的三个小设置

    1、原来大家在sql窗口写多条sql语句,如果点击“执行”,那么会执行窗口下的所有语句,如果向执行所要的语句,必须选定它。

    williamwong

扫码关注云+社区

领取腾讯云代金券