2016-10-03 51 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あなたは= 1002 a.orgId上a.someId = b.someId

+0

ようt_dtls_prodまたはbasket_prodへの接続を忘れてしまったAND((((a.'type' = 'TWITTER' と(6,7)のd.channel)または(a.'type' = 'GOOGLEPLUS'とd.channel in(5)のd.channel) 、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)OR(a.'type '= 'BLOG'とd.channel in(9,11,15,21)AND d.msgId = a.socialId))..これは接続 –

+0

okです。ビットスピードアップ、条件の順序は重要です –

+0

あなたが 'OR'との結合条件を持っていれば、それとはあまり関係がありません –

関連する問題