[英]Slow SQL query maxing out CPU
我繼承了一個要照顧的站點,並且遇到了 sql 查詢的問題,該查詢在站點上運行作業時會耗盡 CPU。
不幸的是,我是一名前端開發人員,雖然我對簡單的 sql 沒問題,但這對我來說太復雜了。 問題似乎出在第二個 EXISTS 及其與主查詢的連接中。
這是代碼,它應該收集要發送給公司的項目 ID 列表。
這個查詢有什么明顯的問題嗎?
SELECT mc.id AS company_id,
mi.id AS item_id,
EXISTS (
SELECT 1
FROM mysite AS m2
JOIN mysite_order AS mo2
ON m2.mysite_order_id = mo2.id
WHERE mo2.mysite_item_id = mo.mysite_item_id
AND m2.company_email_sent = 'Yes'
) AS email_sent_before,
m.id AS mysite_id,
m.mysite_code_prefix,
m.mysite_code_suffix
FROM mysite_company AS mc
JOIN mysite_item AS mi
ON mc.id = mi.company_id
JOIN mysite_order AS mo
ON mi.id = mo.mysite_item_id
JOIN mysite AS m
ON mo.id = m.mysite_order_id
WHERE mi.avail_end_date <= CURDATE()
AND EXISTS (
SELECT 1
FROM mysite AS m3
JOIN mysite_order AS mo3
ON m3.mysite_order_id = mo3.id
WHERE mo3.mysite_item_id = mo.mysite_item_id
AND m3.company_email_sent = 'No' )
ORDER BY company_id ASC, item_id ASC, m.mysite_code_prefix ASC,
m.mysite_code_suffix ASC
LIMIT 1
如何使用這樣的內聯子查詢:
...
( SELECT m2.company_email_sent, COUNT(m2.company_email_sent)
FROM mysite AS m2
JOIN mysite_order AS mo2
ON m2.mysite_order_id = mo2.id
WHERE mo2.mysite_item_id = mo.mysite_item_id
AND m2.company_email_sent IN ( 'Yes', 'No' )
GROUP BY m2.company_email_sent ) email_status
...
然后,您可以加入該內聯子查詢,並查找 COUNT 是否為 0,作為執行這兩個單獨的 EXISTS 子查詢的替代方法。
另外 - 我在這里對業務邏輯做出假設 - 你不希望在子查詢中加入mysite_company
嗎? 即,您是否關心有關該商品的 email 是否已發送給下訂單的客戶? 目前,子查詢中沒有與外部查詢中的mysite_customer
相關的任何內容。
最大的問題是第二個exists()
。
根據您要查找的內容,可以將其替換為mo.company_email_sent = 'No'
或 join 語句。
更理想的是,您希望將該exists()
語句的值存儲在索引字段中。 它可以使用觸發器或使用應用程序級代碼進行設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.