2013-03-18 3 views
1

Я использую простой запрос левого соединения для извлечения двух строк данных из двух отдельных таблиц. Они оба содержат общий столбец с именем domain, и я присоединяюсь к ним в этом столбце, чтобы вычислить значение, основанное на посещениях таблиц и других табличных доходах.Замедленный запрос MySQL с использованием LEFT JOIN

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 строк данных, которая нуждается в сравнивающие.

Любые предложения по эффективному коду или по лучшему пути решения этого будут оценены!

+0

показать результат объяснения вопроса .. – divyabharathi

ответ

0

Измените запрос, как этот

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; 
0

ЛЕВАЯ РЕГИСТРИРУЙТЕСЬ ненужно, как вы проверяете значение элемента с правой стороны соединения. INNER JOIN будет работать так же хорошо и может быть быстрее.

1

спасибо за рашель за открытие двери, это то, что сработало в конце, с временем выполнения 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 
Смежные вопросы