MySQL“;独特的;加入超级慢

MySQL“;独特的;加入超级慢,mysql,join,distinct,Mysql,Join,Distinct,我有下面的查询,它给出了正确的结果。但是它非常慢。 让它慢下来的是 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 F

我有下面的查询,它给出了正确的结果。但是它非常慢。 让它慢下来的是

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 

您是否尝试用EXISTS替换IN

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

一旦找到与条件匹配的第一行,EXISTS部分应立即停止子查询。我读到了关于这是否真的发生的相互矛盾的评论,因此您可能会在其中设置一个限制1,以查看您是否获得了任何收益。

您是否尝试将in替换为EXISTS

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

一旦找到与条件匹配的第一行,EXISTS部分应立即停止子查询。我读到了关于这是否真的发生的相互矛盾的评论,所以你可能会在那里设置一个限制1,看看你是否获得了任何收益。

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

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 

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

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 

customer_order表是否不跟踪交货或账单地址?当然有可能只获得每个订单的一个地址?从子查询中删除GROUPBY这可能会help@Rory客户订单确实跟踪账单地址。但这通常不是订单的来源国。我们的大多数客户都在欧洲,每个国家的订单都有。但是计费中心通常集中在某个地方。@Raheel:我需要Group By来删除重复项。customer\u order表是否不跟踪交货或计费地址?当然有可能只获得每个订单的一个地址?从子查询中删除GROUPBY这可能会help@Rory客户订单确实跟踪账单地址。但这通常不是订单的来源国。我们的大多数客户都在欧洲,每个国家的订单都有。但是计费中心通常集中在某个地方。@Raheel:我需要Group By来删除重复项。这确实快得多,但它仍然统计每个地址。不,如果您删除地址表的连接,并且只保留这个Exists子查询,则不会。这确实快得多,但它仍然统计每个地址。不,如果删除地址表的联接,并且只保留这个Exists子查询,则不会发生这种情况。