【问题标题】:Slow MySQL query using LEFT JOIN使用 LEFT JOIN 的慢 MySQL 查询
【发布时间】:2013-03-18 09:02:32
【问题描述】:

我正在使用一个简单的左连接查询从两个单独的表中获取两行数据。他们都拥有一个名为 domain 的公共列,我将他们加入到这一列中,以根据一个表访问量和其他表的收入来计算一个值。

SELECT t1.`domain` AS `domain`,
       (SUM(earnings)/SUM(visits)) AS `rpv` 
FROM   hat_adsense_stats t1 
LEFT JOIN hat_analytics_stats t4 ON t4.`domain`=t1.`domain`  
WHERE(t1.`hat_analytics_id`='91' OR t1.`hat_analytics_id`='92') 
       AND t1.`date`>='2013-02-18' 
       AND t4.`date`>='2013-02-18' 
GROUP BY t1.`domain` 
ORDER BY rpv DESC 
LIMIT 10;

这是我运行的查询,执行需要 9.060 秒。

hat_adsense_stats 表包含 60887 条记录 hat_analytics_stats 表包含 190780 条记录

但是通过 domain 分组,它返回需要比较的 186 行数据。

任何关于低效代码或解决此问题的更好方法的建议都将不胜感激!

【问题讨论】:

  • 显示解释查询结果..

标签: mysql


【解决方案1】:

感谢 raheel 开门,这最终奏效了,执行时间为 0.051 秒。 :)

SELECT 
    t1.`domain` AS `domain`, 
    SUM(earnings)/visits AS `rpv` 
FROM hat_adsense_stats t1 
    INNER JOIN (SELECT 
        domain, 
        SUM(visits) AS visits 
        FROM hat_analytics_stats 
        WHERE `date` >= "2013-02-18" 
        GROUP BY domain) AS t4 
    ON t4.domain = t1.domain  
WHERE t1.`hat_analytics_id` IN('91','92') 
AND t1.`date`>='2013-02-18' 
GROUP BY t1.`domain` 
ORDER BY rpv DESC 
LIMIT 10

【讨论】:

    【解决方案2】:

    像这样更改您的查询

    SELECT
      t1.`domain`           AS `domain`,
      t2.earnings/t2.visits AS `rpv`
    FROM hat_adsense_stats t1
      INNER JOIN (SELECT
                    domain,
                    sum(earnings)          AS earnings,
                    SUM(visits)            AS visits
                 FROM hat_adsense_stats
                 GROUP BY domain) AS t2
        on t2.domain = t1.domain
      LEFT JOIN hat_analytics_stats t4
        ON t4.`domain` = t1.`domain`
    WHERE t1.`hat_analytics_id` IN('91','92')
        AND t1.`date` >= '2013-02-18'
        AND t4.`date` >= '2013-02-18'
    GROUP BY t1.`domain`
    ORDER BY rpv DESC
    LIMIT 10;
    

    【讨论】:

      【解决方案3】:

      LEFT JOIN 是不必要的,因为您从连接的右侧检查项目的值。 INNER JOIN 在这里也可以工作,而且可能会更快

      【讨论】:

        猜你喜欢
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 2019-03-07
        • 1970-01-01
        • 2012-05-14
        • 2015-02-22
        • 2012-09-05
        相关资源
        最近更新 更多