一个mysql查询的优化
巴扎黑
巴扎黑 2017-04-17 11:45:44
0
2
276

SELECT COUNT(1) as num,uid,sid,username FROM sd_users GROUP BY sid HAVING num >1 ORDER BY num DESC

在实际测试中发现由于数据量超过60万在group的时候就产生了巨大的威胁力,查询执行缓慢
一直停留在copy tmp table下

explain发现需要重建索引导致请问类似的语句应该如何优化

+----+-------------+-----------+-------+---------------+-----+---------+------+--------+---------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+-------+---------------+-----+---------+------+--------+---------------------------------+ | 1 | SIMPLE | sd_users | index | NULL | sid | 97 | NULL | 539029 | Using temporary; Using filesort | +----+-------------+-----------+-------+---------------+-----+---------+------+--------+---------------------------------+ 1 row in set
巴扎黑
巴扎黑

reply all (2)
巴扎黑

没走索引,全表扫描外加临时表 排序 ……

最起码要有个sid的索引吧。

有了sid的索引之后:
另外你这个语句里的uid,username确定有意义么?同一个sid里面的uid,username都一样?
如果去掉uid,username的话,这个sql就只走索引不会去回表应该有比较大的提升。

    左手右手慢动作

    首先如 @gmase 所言,确保 sid 字段有索引。其次因为这是一个全表扫描的统计查询,所以性能消耗确实会比较大,如果实在撑不住,可以考虑创建一个包含sidcount两个字段的中间表,然后及时更新它。

      Latest Downloads
      More>
      Web Effects
      Website Source Code
      Website Materials
      Front End Template
      About us Disclaimer Sitemap
      php.cn:Public welfare online PHP training,Help PHP learners grow quickly!