【问题标题】:MySQL "Distinct" join super slowMySQL“不同”加入超级慢
【发布时间】:2012-04-22 18:18:56
【问题描述】:

我有以下查询,它给了我正确的结果。但是超级慢。 导致它变慢的是

AND a.id IN (SELECT id FROM st_address GROUP BY element_id)

部分。查询应显示我们从哪些国家获得了多少订单。
一个人可以有多个地址,但在这种情况下,我们只需要一个。
否则它将多次计算订单。也许有更好的方法来实现这一目标?一个人或某事的独特连接?

SELECT cou.title_en, COUNT(co.id), SUM(co.price) AS amount
FROM customer_order co
JOIN st_person p ON (co.person_id = p.id)
JOIN st_address a ON (co.person_id = a.element_id AND a.element_type_id = 1)
JOIN st_country cou ON (a.country_id = cou.id) 
WHERE order_status_id != 7 AND a.id IN (SELECT id FROM st_address GROUP BY element_id)
GROUP BY cou.id 

【问题讨论】:

  • customer_order 表是否不跟踪收货地址或帐单地址?确定每个订单只能获得一个特定地址吗?
  • 从子查询中删除 group by 这可能会有所帮助
  • @Rory customer_order 确实跟踪帐单地址。但这通常不是订单来自的国家/地区。我们的大多数客户都在欧洲和每个国家的订单。但计费中心通常集中在某个地方。
  • @Raheel:我需要 Group By 删除重复项。

标签: mysql join distinct


【解决方案1】:

您是否尝试将 IN 替换为 EXISTS?

AND EXISTS (SELECT 1 FROM st_address b WHERE a.id = b.id)

一旦找到匹配条件的第一行,EXISTS 部分就应该停止子查询。我已经阅读了关于这是否真的发生的冲突 cmets,所以你可能会在那里抛出一个限制 1 来看看你是否有任何收获。

【讨论】:

  • 确实快了很多,但它仍然计算每个地址。​​
  • 不,如果您删除地址表的连接并仅保留此 Exists 子查询,则不会。
【解决方案2】:

我找到了一个更快的解决方案。诀窍是与子查询连接:

JOIN (SELECT element_id, country_id, id FROM st_address WHERE element_type_id = 1 GROUP BY 

这是完整的查询:

SELECT cou.title_en, COUNT(o.id), SUM(o.price) AS amount 
FROM customer_order o
JOIN (SELECT element_id, country_id, id FROM st_address WHERE element_type_id = 1 GROUP BY element_id) AS a ON (o.person_id = a.element_id)
JOIN st_country cou ON (a.country_id = cou.id) 
WHERE o.order_status_id != 7 
GROUP BY cou.id 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2023-02-06
    相关资源
    最近更新 更多