账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    MySQL 如何优化分组统计查询
    • 2019-07-19 00:00
    • 11
    18
    0

    我有文章表 article,分类表 sort
    文章表的 views 字段代表文章浏览量,sort_id 代表分类 id

    我需要在分类列表中显示每个分类的总浏览量,SQL 大概是这样的:

    select a.id, sum(b.views) from sort as a left join article as b on a.id = b.sort_id group by a.id limit 10;

    实际情况比上面更复杂,数据在 30 万左右,过滤条件也非常多,即使 sort_idviews 都加了索引,这种 SQL 也运行起来特别慢。

    我目前的做法是先查出分类列表,然后在 PHP 里遍历分类列表,在循环里单独 sum 每个分类的总浏览量

    这样速度快了一点,但是依然很慢,所以我把每条分页的数据都缓存到了 redis,只有第一次会在循环里 sum 数据,后面都走缓存,这种做法也有缺点,就是数据并不是实时的数据。

    请问有更好的做法吗?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 噜噜噜瓜o3o 普通会员 1楼

      MySQL 提供了多种方式来优化分组统计查询,包括但不限于以下几种:

      1. 分组:在查询中使用 GROUP BY 子句对分组进行处理,这样可以按照分组的列进行聚合(如求和、计数、平均值等)。例如:

      sql SELECT column1, COUNT(column2) FROM table_name GROUP BY column1;

      1. 聚合函数:MySQL 提供了多种聚合函数,如 SUM、AVG、COUNT、MIN、MAX 等,可以用于计算分组统计值。例如:

      sql SELECT column1, SUM(column2) FROM table_name GROUP BY column1;

      1. 内联函数:MySQL 提供了 IN()、IS NULL、IS NOT NULL 等内联函数,可以用于过滤分组数据。例如:

      sql SELECT column1, column2 FROM table_name WHERE column1 IN (value1, value2, ...);

      1. 子查询:MySQL 提供了子查询的功能,可以用于在内部查询中计算分组统计值。例如:

      sql SELECT column1, AVG(column2) FROM ( SELECT column1, column2 FROM table_name GROUP BY column1 ) subquery;

      1. 分组窗口函数:MySQL 提供了窗口函数(如 AVG()、MAX()、MIN()、SUM()、COUNT() 等)和聚合函数的结合,可以用于对分组数据进行更复杂的统计计算。例如:

      sql SELECT column1, AVG(column2) FROM ( SELECT column1, column2 FROM table_name GROUP BY column1 WITHWindow(name='Window1') ) subquery JOIN ( SELECT column1, column2 FROM table_name GROUP BY column1 WITHWindow(name='Window2') ) window_table ON subquery.column1 = window_table.column1 AND subquery.column2 = window_table.column2;

      以上是一些常用的 MySQL 优化分组统计查询的方法,但具体的优化策略还需要根据实际的查询需求和数据情况来决定。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部