一个mysql查询的优化

 丧失Man 发布于 2022-11-05 01:42

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

    2022-11-09 01:10 回答
  • 没走索引,全表扫描外加临时表 排序 ……

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

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

    2022-11-09 01:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有