为了账号安全,请及时绑定邮箱和手机立即绑定

一个mysql查询的优化

一个mysql查询的优化

尚方宝剑之说 2019-04-16 20:26:17
SELECTCOUNT(1)asnum,uid,sid,usernameFROMsd_usersGROUPBYsidHAVINGnum>1ORDERBYnumDESC在实际测试中发现由于数据量超过60万在group的时候就产生了巨大的威胁力,查询执行缓慢一直停留在copytmptable下explain发现需要重建索引导致请问类似的语句应该如何优化+----+-------------+-----------+-------+---------------+-----+---------+------+--------+---------------------------------+|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|+----+-------------+-----------+-------+---------------+-----+---------+------+--------+---------------------------------+|1|SIMPLE|sd_users|index|NULL|sid|97|NULL|539029|Usingtemporary;Usingfilesort|+----+-------------+-----------+-------+---------------+-----+---------+------+--------+---------------------------------+1rowinset
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

没走索引,全表扫描外加临时表排序……
最起码要有个sid的索引吧。
有了sid的索引之后:
另外你这个语句里的uid,username确定有意义么?同一个sid里面的uid,username都一样?
如果去掉uid,username的话,这个sql就只走索引不会去回表应该有比较大的提升。
                            
查看完整回答
反对 回复 2019-04-16
?
慕斯709654

TA贡献1840条经验 获得超5个赞

首先如@gmase所言,确保sid字段有索引。其次因为这是一个全表扫描的统计查询,所以性能消耗确实会比较大,如果实在撑不住,可以考虑创建一个包含sid和count两个字段的中间表,然后及时更新它。
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 388 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信