2017-02-07 4 views
0
SELECT pm.team, 
     pm.username, 
     count(DISTINCT if(offer_pm.revenue>0.0,adv.adv_name,NULL)) AS adv_count, 
     sum(offer_pm.click), 
     sum(offer_pm.install), 
     sum(offer_pm.revenue), 
     sum(offer_pm.cost) 
FROM (pm pm 
     INNER JOIN offer_pm_adv_day offer_pm ON offer_pm.pm_id=pm.id) 
INNER JOIN advertiser adv ON offer_pm.adv_id=adv.id 
WHERE offer_pm.logdate>='2016-01-01' 
    AND offer_pm.logdate<='2017-01-01' 
GROUP BY pm.team, 
     pm.username 

Если есть где условие offer_pm.logdate>='2016-01-01' and offer_pm.logdate<='2017-01-01' ниже это объяснить для SQL. И время стоимость долго (20s)Mysql внутреннее соединение с где

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: offer_pm 
     type: range 
possible_keys: PRIMARY,adv_id_index,logdate_index 
      key: PRIMARY 
     key_len: 3 
      ref: NULL 
     rows: 713003 
     Extra: Using where; Using temporary; Using filesort -->Useing where 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: pm 
     type: eq_ref 
possible_keys: PRIMARY,uniq_name_team 
      key: PRIMARY 
     key_len: 4 
      ref: summary_report_refactor2.offer_pm.pm_id 
     rows: 1 
     Extra: Using where  

*************************** 3. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: adv 
     type: eq_ref 
possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 4 
      ref: summary_report_refactor2.offer_pm.adv_id 
     rows: 1 
     Extra: Using where 

Но SQL

SELECT pm.team, 
     pm.username, 
     count(DISTINCT if(offer_pm.revenue>0.0,adv.adv_name,NULL)) AS adv_count, 
     sum(offer_pm.click), 
     sum(offer_pm.install), 
     sum(offer_pm.revenue), 
     sum(offer_pm.cost) 
FROM (pm pm 
     INNER JOIN offer_pm_adv_day offer_pm ON offer_pm.pm_id=pm.id) 
INNER JOIN advertiser adv ON offer_pm.adv_id=adv.id 
GROUP BY pm.team, 
     pm.username 

, которые не с где условия.

Время в пути - 2 с. Объяснение:

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: pm 
     type: index 
possible_keys: PRIMARY,uniq_name_team 
      key: uniq_name_team 
     key_len: 604 
      ref: NULL 
     rows: 91 
     Extra: Using index; Using filesort 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: offer_pm 
     type: ref 
possible_keys: adv_id_index,pm_id_index 
      key: pm_id_index 
     key_len: 4 
      ref: summary_report_refactor2.pm.id 
     rows: 10042 
     Extra: Using index condition 
*************************** 3. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: adv 
     type: eq_ref 
possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 4 
      ref: summary_report_refactor2.offer_pm.adv_id 
     rows: 1 
     Extra: Using where 

BTW, есть индекс в столбце логарифма.

+0

Что ваш вопрос? –

+0

Какой атрибут является столбцом logdate? – tjfo

+0

Пожалуйста, предоставьте 'SHOW CREATE TABLE' для таблиц. –

ответ

0

Если у вас есть индекс на logdate, попробуйте этот запрос:

SELECT straight_join pm.team, 
     pm.username, 
     count(DISTINCT if(offer_pm.revenue>0.0,adv.adv_name,NULL)) AS adv_count, 
     sum(offer_pm.click), 
     sum(offer_pm.install), 
     sum(offer_pm.revenue), 
     sum(offer_pm.cost) 
FROM offer_pm_adv_day offer_pm 
INNER JOIN pm ON offer_pm.pm_id=pm.id 
INNER JOIN advertiser adv ON offer_pm.adv_id=adv.id 
WHERE offer_pm.logdate>='2016-01-01' 
    AND offer_pm.logdate<='2017-01-01' 
GROUP BY pm.team, 
     pm.username ; 

Это в основном имеет дело с тем, как организованы ваши таблицы. И какие ключи использует планировщик выполнения.

С помощью straight_join вы можете принудительно установить способ соединения таблиц и иногда немного улучшить время выполнения. Вы также можете посмотреть на mysql force key или force index.

Или вы можете изменить способ вы соединяющую ваши таблицы:

SELECT pm.team, 
     pm.username, 
     count(DISTINCT if(offer_pm.revenue>0.0,adv.adv_name,NULL)) AS adv_count, 
     sum(offer_pm.click), 
     sum(offer_pm.install), 
     sum(offer_pm.revenue), 
     sum(offer_pm.cost) 
FROM pm 
INNER JOIN offer_pm_adv_day offer_pm ON offer_pm.pm_id=pm.id 
    AND offer_pm.logdate BETWEEN '2016-01-01' AND '2017-01-01' 
INNER JOIN advertiser adv ON offer_pm.adv_id=adv.id 
GROUP BY pm.team, 
     pm.username 
Смежные вопросы