惊人的SQL查询体验,按缓慢的查询优化分组!
作者: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字段并使用了它。
3.优化说实话,我不知道如何优化,我该如何优化这些东西!首先,以下想法是无用的。
理念1:应按空顺序添加;避免无用的排序,但实际上,它对耗时的结果影响很小,而且仍然很慢。
想法2:where条件太复杂且没有索引,这会导致查询变慢,但是我向where条件的所有字段添加了一个复合索引,该索引仍然没有用。
搜索并关注工匠笔记的微信公众号,以回复采访并获得经典采访材料的摘要。
想法3:由于分组依据比较慢,请尝试更改为不同? ? (这是此博客中提到的神奇的地方)他妈的什么? ? ? ! ! !情况如何,瞬间如此之快? ? ! ! !尽管我知道group by和different之间的性能差距很小,但我没想到差距会这么大! ! !伟大的发现! ! 4.您认为这已经结束了吗?我真的希望结束了。
那么这个问题将非常简单地解决。
顺便说一句,我以为一切都结束了,发现了新的知识。
但!将错误转移到测试后,距离测试还超过30秒! ?发生了什么! ! ? ? ?我当然不相信了。
我试图在测试计算机上执行SQL,这花了30多秒钟。
。
。
我回到我的计算机,连接到相同的数据库,并执行了sql,0.8秒! ?在什么情况下,相同的库,相同的SQL,两台计算机的执行之间的差异怎么会这么大!后来,它直接在服务器上执行:我喝醉了,但仍然超过30秒。
。
。
。
我的电脑似乎有问题。
后来,我在几个同事的计算机上进行了实验,最后得出结论:这是因为我使用了SQLyog!嘿,现在我发现只有使用sqlyog来执行此“优化”操作, SQL将花费0.8秒,直接在navcat和服务器上执行将花费30秒以上。
那是sqlyog的问题。
尚不清楚sqlyog是否已优化。
慢查询的问题仍在解决(我认为问题可能是由mysql本身的参数引起的)。
这只是这个坑的记录,sqlyog执行sql speed,而服务器执行sql speed,某些SQL存在巨大差异,这是不可靠的。
搜索并关注工匠笔记的微信公众号,以回复采访并获得经典采访材料的摘要。
5.跟踪(未解决)感谢您的建议,我将回答问题的进展:1.所谓的sqlyog查询速度很快,而命令行查询速度却很慢。
已找到原因。
这是因为sqlyog会在查询语句后默认添加限制1000,因此速度非常快。
这个问题不再纠结。
2.我尝试过的方法(没有一个有用):①在app_account字段中添加索引。
②在sql语句后按空添加顺序。
③在where条件中调整字段的查询顺序,并将索引放在最前面。
④将组合索引添加到where条件的所有字段中。
⑤使用子查询,首先检查where条件中的内容,然后删除重复项。
测试环境和实时网络环境数据仍然有些不同。
我在实时网络上发布了SQL执行的图片(1分钟...):6.最终解决方案谢谢@言枫大佬在42楼的评论!在您提醒之后,我确实发现在解释执行计划中,索引似乎没有使用我创建的idx_end_time。
然后,我在实时网络上进行了果断的尝试,并强制指定了idx_end_time索引。
结果只有0.19秒!至此,问题解决。
实际上,我的同事昨天还想知道该表的索引是否构建过多,从而导致该表的使用不正确。
最初使用idx_org_id和idx_mvno_id。
现在是必填ID