mysqlgroupbysum数据查询慢_记⼀次详细的的SQL查询经
历,groupby慢查询优化
⼀、问题背景
现⽹出现慢查询,在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多秒。那看来就是本⼈的电脑问题。
mysql下载app
后来⼜实验多个同事的电脑,最后得出的结论是:是因为之前⽤的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分钟):
六、最终解决⽅案
经过⽹友的提醒,发现explain执⾏计划⾥,索引好像并没有⽤到创建的idx_end_time。
然后果断在现⽹试了下,强制指定使⽤idx_end_time索引,结果只要0.19秒。
⾄此问题解决,其实同事昨天也在怀疑,是不是这个表索引建的太多了,导致⽤的不对,原本⽤的是idx_org_id和idx_mvno_id。现在强制指定idx_end_time就ok了!
最后再对⽐下改前后的执⾏计划:
改之前(查询要1分钟左右):
改之后(查询只要⼏百毫秒):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。