缓慢的SQL查询最大化CPU

时间:2011-05-27 09:44:55

标签: sql cpu

我继承了一个需要照看的网站,并且在网站上运行作业时,sql查询出现了问题。

不幸的是,我是一名前端开发人员,虽然我对简单的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

2 个答案:

答案 0 :(得分:0)

如何使用这样的内联子查询:

...
    ( 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吗?即,您是否关注有关该项目的电子邮件是否已发送给正在下订单的客户?目前,子查询中没有任何内容与外部查询中的mysite_customer相关。

答案 1 :(得分:0)

最大的问题是第二个exists()

根据您要查找的内容,可以将其替换为mo.company_email_sent = 'No'或加入声明。

更理想的是,您希望将exists()语句的值存储在索引字段中。可以使用触发器或使用应用级代码进行设置。