【问题标题】:How to optimize count and group by subquery operation如何通过子查询操作优化计数和分组
【发布时间】:2013-09-06 21:49:51
【问题描述】:

我的主机说以下查询占用了大量服务器 CPU。请告诉我如何优化它。

SELECT COUNT(*) FROM (SELECT COUNT(*) AS tot,wallpapers.*,resolutions.res_height,resolutions.res_width FROM wallpapers

INNER JOIN analytics ON analytics.`wall_id` = wallpapers.`wall_id`

INNER JOIN resolutions ON resolutions.`res_id` = wallpapers.`res_id`



WHERE analytics.ana_date >= '2013-09-01 16:36:56' AND wallpapers.wall_status = 'public'

GROUP BY analytics.`wall_id`) as Q 

请注意,分析表包含所有网页浏览和点击的记录。所以它非常非常大。

【问题讨论】:

    标签: mysql sql database optimization count


    【解决方案1】:

    据我所知,在通过连接和 WHERE 子句过滤后,您的查询只计算不同的 wall_id 值。这样的事情应该很接近:

    SELECT COUNT(DISTINCT analytics.wall_id)
    FROM wallpapers
    INNER JOIN analytics ON analytics.wall_id = wallpapers.wall_id
    INNER JOIN resolutions ON resolutions.res_id = wallpapers.res_id
    WHERE analytics.ana_date >= '2013-09-01 16:36:56'
      AND wallpapers.wall_status = 'public'
    

    【讨论】:

      【解决方案2】:

      这是您的查询:

      SELECT COUNT(*)
      FROM (SELECT COUNT(*) AS tot, wallpapers.*, resolutions.res_height, resolutions.res_width
            FROM wallpapers INNER JOIN
                 analytics
                 ON analytics.`wall_id` = wallpapers.`wall_id` INNER JOIN
                 resolutions
                 ON resolutions.`res_id` = wallpapers.`res_id`
            WHERE analytics.ana_date >= '2013-09-01 16:36:56' AND
                  wallpapers.wall_status = 'public'
            GROUP BY analytics.`wall_id`
      ) as Q 
      

      子查询需要额外的努力,group by 也是如此。您可以将其替换为:

      SELECT COUNT(distinct analytics.wall_id)
      FROM wallpapers INNER JOIN
           analytics
           ON analytics.`wall_id` = wallpapers.`wall_id` INNER JOIN
           resolutions
           ON resolutions.`res_id` = wallpapers.`res_id`
      WHERE analytics.ana_date >= '2013-09-01 16:36:56' AND
            wallpapers.wall_status = 'public';
      

      然后您也许可以使用索引进行进一步优化,但查看此查询的 explain 和表上的当前索引会很有帮助。

      【讨论】:

        猜你喜欢
        • 2016-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多