[英]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.