簡體   English   中英

使用LEFT JOIN進行緩慢的MySQL查詢

[英]Slow MySQL query using LEFT JOIN

我使用一個簡單的左聯接查詢從兩個單獨的表中獲取兩行數據。 它們都擁有一個名為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行數據。

任何有關低效率代碼或解決此問題的更好方法的建議將不勝感激!

感謝raheel打開門,這終於奏效了,執行時間為0.051sec。 :)

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

像這樣更改您的查詢

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;

從聯接的右側檢查項目的值時,不需要LEFT JOIN。 INNER JOIN在這里也可以正常工作,並且可能會更快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM