簡體   English   中英

mysql查詢需要3個小時來運行和處理

[英]mysql query takes 3 hours to run and process

我有一個在深夜執行 cron 作業的查詢。 然后通過生成器處理此查詢,因為它必須填充另一個數據庫,並且在將其發送到另一個數據庫之前我會進行一些額外的處理和檢查。

我想知道無論如何我是否可以加快此查詢並希望將其保留為單個查詢。 還是我會被迫創建其他查詢並在 PHP 中加入數據? 這會查詢主 mautic 數據庫。

SELECT  c.id as "campaign_id",
        c.created_by_user,
        c.name,
        c.date_added,
        c.date_modified,
        (SELECT DISTINCT COUNT(cl.lead_id)) as number_of_leads,
        GROUP_CONCAT(lt.tag) as tags,
        cat.title as category_name,
        GROUP_CONCAT(ll.name) as segment_name,
        GROUP_CONCAT(emails.name) as email_name,
        CASE WHEN c.is_published = 1 THEN "Yes" ELSE "No" END AS "published",
        CASE WHEN c.publish_down > now() THEN "Yes" 
             WHEN c.publish_down > now() AND c.is_published = 0 THEN "Yes" 
             ELSE "No" END AS "expired"
FROM campaigns c 
    LEFT JOIN campaign_leads cl ON cl.campaign_id = c.id
    LEFT JOIN lead_tags_xref ltx on cl.lead_id = ltx.lead_id 
    LEFT JOIN lead_tags lt on ltx.tag_id = lt.id 
    LEFT JOIN categories cat on c.category_id = cat.id 
    LEFT JOIN lead_lists_leads llist on cl.lead_id = llist.lead_id 
    LEFT JOIN lead_lists ll on llist.leadlist_id = ll.id 
    LEFT JOIN email_list_xref el on ll.id = el.leadlist_id 
    LEFT JOIN emails on el.email_id = emails.id 
GROUP BY c.id;

這是解釋https://prnt.sc/qQtUaLK3FIpQ的圖像

定義活動表: https ://prnt.sc/6JXRGyMsWpcd

Campaign_leads 表https://prnt.sc/pOq0_SxW2spe

Lead_tags_xref 表https://prnt.sc/oKYn92O82gHL

鉛標簽表https://prnt.sc/ImH81ECF6Ly1

類別表https://prnt.sc/azQj_Xwq3dw9

Lead_lists_lead 表https://prnt.sc/x5C5fiBFP2N7

Lead_lists 表https://prnt.sc/bltkM0f3XeaH

email_list_xref 表https://prnt.sc/kXABVJSYWEUI

電子郵件表https://prnt.sc/7fZcBir1a6QT

我只希望完成 871 行,我已經確定連接可能非常大,數以萬計。

似乎您有一個無用的選擇 DISTINTC .. 您是否正在尋找一個 conut(distinct .. )
通過這種方式,您可以避免主選擇中每一行的嵌套選擇..

SELECT  c.id as "campaign_id",
        c.created_by_user,
        c.name,
        c.date_added,
        c.date_modified,
        COUNT(DISTINCT cl.lead_id) as number_of_leads,
        GROUP_CONCAT(lt.tag) as tags,
        cat.title as category_name,
        GROUP_CONCAT(ll.name) as segment_name,
        GROUP_CONCAT(emails.name) as email_name,
        CASE WHEN c.is_published = 1 THEN "Yes" ELSE "No" END AS "published",
        CASE WHEN c.publish_down > now() THEN "Yes" 
             WHEN c.publish_down > now() AND c.is_published = 0 THEN "Yes" 
             ELSE "No" END AS "expired"
FROM campaigns c 
    LEFT JOIN campaign_leads cl ON cl.campaign_id = c.id
    LEFT JOIN lead_tags_xref ltx on cl.lead_id = ltx.lead_id 
    LEFT JOIN lead_tags lt on ltx.tag_id = lt.id 
    LEFT JOIN categories cat on c.category_id = cat.id 
    LEFT JOIN lead_lists_leads llist on cl.lead_id = llist.lead_id 
    LEFT JOIN lead_lists ll on llist.leadlist_id = ll.id 
    LEFT JOIN email_list_xref el on ll.id = el.leadlist_id 
    LEFT JOIN emails on el.email_id = emails.id 
GROUP BY c.id;

無論如何要確保你有一個適當的復合索引

table campaign_leads columns campaign_id, lead_id
table lead_tags_xref columns lead_id, tag_id
table lead_lists_leads columns lead_id, leadlist_id
table email_list_xref columns leadlist_id, email_id 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM