当前位置: 首页 > 科技观察

记一次神奇的SQL查询体验,groupby慢查询优化

时间:2023-03-21 11:50:04 科技观察

1.问题背景现网存在慢查询。在500万量级的情况下,单表查询速度30多秒。SQL需要优化。如下:我在测试环境中构造了500万条数据来模拟这个慢查询。简单来说就是查询在一定条件下有哪些用户可用。很简单的sql,可以看到查询耗时37秒。下面说说app_account字段的分布。随机生成5000个不同的随机数,分布在500万条数据中。平均每个app_account会有1000个重复值,总共有5000种类型。2.查看执行计划,可以看到我在groupby字段上加了一个索引,并使用了。3.优化说实话,我不会优化,这东西怎么优化!首先,下面的想法是没有用的。思路一:orderbynull后面应该加上;避免无用的排序,但实际上对耗时的结果影响不大,还是很慢。思路二:where条件太复杂,没有索引,导致查询慢,但是我给where条件的所有字段加了复合索引,还是没用。思路三:既然groupby慢,换成distinct试试??(这里就是这篇博客提到的神奇的地方)。他妈的???!!!怎么了,一瞬间这么快??!!!虽然知道groupby和distinct性能差距很小,但是真没想到差距这么大!!!伟大的发现!!4.你认为这是结束了吗?真希望就这样结束了,那么这个问题就很容易解决了,顺便也自以为是的发现了一个新知识。但!bug转测试后,测试完,还是30多秒!?这里发生了什么事!!???我当然不相信。在测试机上执行SQL需要30多秒。..我回到我的电脑,连接到同一个数据库,执行sql,0.8秒!?这是什么情况,同一个库,同一个sql,两台电脑的执行力怎么会有这么大的差距!后来直接在服务器上执行:醉了,还是30多秒。...看来是我电脑的问题。后来又在几位同事的电脑上试验,最后得出结论是因为我用了SQLyog!哎,现在才发现只用sqlyog执行这个“优化过”的sql要0.8秒,直接在navcat和服务器上执行要30多秒。那就是sqlyog的问题,不清楚sqlyog有没有做优化。查询慢的问题还在解决中(我觉得可能是mysql本身参数的问题)。这里只是记录一下这个坑,sqlyog执行sql的速度,和server执行sql的速度,有些sql差别很大,不靠谱。5.跟进(暂未解决)感谢大家在评论中提出建议。我来回复一下问题的进展:1.所谓sqlyog查询快,命令行查询慢。原因已经找到。是因为sqlyog会在查询语句后默认加上limit1000,所以会很快。这个问题不再纠结。2、我试过的方法(都不行):①给app_account字段加索引。②在sql语句后加上orderbynull。③调整where条件中字段的查询顺序,将有索引的放在最前面。④为所有where条件字段添加组合索引。⑤使用子查询的方法先查询where条件中的内容,然后去掉重复的。测试环境的数据和现网环境还是有点差距的。我贴一张在现网执行sql的图(1分钟。。。):六、最终解决方案。经过你的提醒,我确实发现在explainexecutionplan中,index好像没有使用我创建的idx_end_time。然后果断在现网试了一下,强制使用idx_end_time索引,结果只有0.19秒!至此,问题已经解决。其实昨天同事也怀疑是不是这个表的索引建多了,导致用错了。最初,使用了idx_org_id和idx_mvno_id。现在强制指定idx_end_time就可以了!最后对比一下变更前后的执行计划:变更前(查询耗时1分钟左右):变更后(查询仅耗时几百毫秒):