簡體   English   中英

慢 SQL 查詢最大化 CPU

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

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