如何在查询中删除范围检查

时间:2016-10-03 13:38:41

标签: mysql sql

我有以下查询,当我对查询进行解释时,它说“检查每条记录的范围(索引图: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行的下降时间出现,但除此之外,它就会死亡。

1 个答案:

答案 0 :(得分: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_prodbasket_prod的关联,例如a.someId = b.someId