2016-10-03 3 views
0

У меня есть следующий запрос, когда я объясняю запрос, он говорит: «Диапазон проверен для каждой записи (индексная карта: 0x8)». Я предполагаю, что это одна из причин, запрос, как медленно, как можно улучшить этот Explain PlanКак удалить проверку диапазона в запросе

Запрос выглядит, как следовать в настоящее время,

explain select 
     * 
    from 
     (select 
      CASE WHEN dd.parentId IS NOT NULL 
     THEN CONCAT(dd.`profileId`,dd.`orgId`,dd.parentId) 
     ELSE CONCAT(dd.`profileId`,dd.`orgId`,dd.id) END as ticketId,dd.* 
    from 
     t_dtls_prod dd where dd.currentlyActive = true and dd.dataSource ='SAND' AND msgCreatedOn BETWEEN '2016-09-01 00:00:00' 
    AND '2016-10-03 00:00:00' and dd.profileId = 148 group by ticketId) as d 
    left join basket_prod b on b.basketId=d.toBasketId 
    left join lead_social_accts_prod a on a.orgId=1002 
    AND (
    (
    (
     (a.`type`='TWITTER' and d.channel in (1,34)) or (a.`type`='FACEBOOK' and d.channel in (6,7)) 
    or (a.`type`='GOOGLEPLUS' and d.channel in (5,25)) or (a.`type`='LINKEDIN' and d.channel =30) 
    or (a.`type`='GOOGLEPLUS' and d.channel=36) or ((a.`type`='YOUTUBE' or a.`type`='GOOGLEPLUS') and d.channel=27) 
    or (a.`type`='TUMBLR' and d.channel in (29,31)) or 
     (a.`type`='INSTAGRAM' and d.channel=35) 
    ) 
    AND 
    d.userChannelId=a.socialId) OR 
     (a.`type`='BLOG' and d.channel in (9,11,15,21) AND d.msgId=a.socialId)) 
     left join lead_prod l on l.leadId=a.leadId and l.orgId=1002 where d.profileId = 148 limit 0,1000 

Результатов опоздавших в то время спуска ДО 1000 строк , но помимо этого он просто умирает.

ответ

0

Это должно быть лучше

EXPLAIN SELECT 
    d.*, b.*, a.*, l.*, 
    (CASE WHEN d.parentId IS NOT NULL 
     THEN CONCAT(d.`profileId`, d.`orgId`, d.parentId) 
     ELSE CONCAT(d.`profileId`, d.`orgId`, d.id) END) as ticketId 
FROM 
     t_dtls_prod d 
LEFT JOIN basket_prod b ON b.basketId = d.toBasketId 
LEFT JOIN lead_social_accts_prod a ON a.orgId = 1002 AND 
    (
     (d.msgId = a.socialId AND d.channel in (9,11,15,21) AND a.`type`='BLOG') 
     OR 
     (
      d.userChannelId = a.socialId 
      AND 
      (
       (d.channel IN (1,34) AND a.`type`='TWITTER') 
       OR 
       (d.channel IN (6,7) AND a.`type`='FACEBOOK') 
       OR 
       (d.channel IN (5, 25, 36) AND a.`type`='GOOGLEPLUS') 
       OR 
       (d.channel = 30 AND a.`type`='LINKEDIN') 
       OR 
       (d.channel=27 AND a.`type` IN ('YOUTUBE', 'GOOGLEPLUS')) 
       OR 
       (d.channel IN (29,31) AND a.`type`='TUMBLR') 
       OR 
       (d.channel = 35 AND a.`type`='INSTAGRAM') 
      ) 
     ) 
    ) 
LEFT JOIN lead_prod l ON l.leadId = a.leadId AND l.orgId = 1002 
WHERE 
    d.currentlyActive = true AND d.dataSource ='SAND' AND msgCreatedOn BETWEEN '2016-09-01 00:00:00' AND '2016-10-03 00:00:00' AND d.profileId = 148 

GROUP BY ticketId 
LIMIT 0,1000 

LEFT JOIN lead_social_accts_prod a ON a.orgId = 1002 здесь Вы забыли подключение к t_dtls_prod или basket_prod как a.someId = b.someId

+0

на a.orgId = 1002. И ((((a.'type' = 'TWITTER' и d.channel в (1,34)) или (a.'type' = 'FACEBOOK' и d.channel в (6,7)) или (a.'type' = 'GOOGLEPLUS' и d.channel in (5 , 25)) или (a.'type' = 'LINKEDIN' и d.channel = 30) или (a.'type' = 'GOOGLEPLUS' и d.channel = 36) или ((a.'type' = ' YOUTUBE 'или a.'type' =' GOOGLEPLUS ') и d.channel = 27) AND d.userChannelId = a.socialId) ИЛИ (a.type) '= 'BLOG' и d.channel in (9,11,15,21) И d.msgId = a.socialId)) .. это соединение –

+0

ok, тогда .. бит ускоряется, порядок условий важен –

+0

i вещь там не имеет большого отношения к этому, если у вас есть условие соединения с 'OR' –

Смежные вопросы