[英]In query taking too long
我有一個帶有IN子句的查詢,處理時間太長,不知道出了什么問題:
Select * from orders
where orders.id IN
(
SELECT orders.id FROM `orders`
INNER JOIN `line_items` ON `line_items`.`order_id` = `orders`.`id`
WHERE (line_items.coupon_id = 133)
GROUP BY orders.id
UNION
SELECT orders.id FROM `orders`
INNER JOIN `payments` ON `payments`.`order_id` = `orders`.`id`
WHERE (payments.coupon_id = 133)
GROUP BY orders.id
UNION
SELECT orders.id FROM `orders`
INNER JOIN `coupon_applications` ON `coupon_applications`.`order_id` = `orders`.`id`
WHERE (coupon_applications.coupon_id =133)
GROUP BY orders.id
);
但是以下部分工作正常:
SELECT orders.id FROM `orders`
INNER JOIN `line_items` ON `line_items`.`order_id` = `orders`.`id`
WHERE (line_items.coupon_id = 133)
GROUP BY orders.id
UNION
SELECT orders.id FROM `orders`
INNER JOIN `payments` ON `payments`.`order_id` = `orders`.`id`
WHERE (payments.coupon_id = 133)
GROUP BY orders.id
UNION
SELECT orders.id FROM `orders`
INNER JOIN `coupon_applications` ON `coupon_applications`.`order_id` = `orders`.`id`
WHERE (coupon_applications.coupon_id =133)
GROUP BY orders.id
這需要多少時間?
優化查詢執行有很多限制。 您的查詢似乎沒有問題,但“ SELECT *”除外,您最好進行更改(但這不會對您的查詢性能產生重大影響)。
不過,如果您認為查詢不合適,請提供有關此問題的更多詳細信息。
首先:避免使用IN()進行子選擇,這似乎會破壞優化器(例如:編輯,請參見https://dba.stackexchange.com/a/63671/24475 )。 做就是了
SELECT o.*
FROM orders as o
inner join...
UNION
SELECT o.*
FROM orders as o
UNION
...
當某張表中的某行有很多行時,WHERE EXISTS可以幫助(或不幫助,這取決於):
SELECT o.*
FROM orders o
WHERE EXISTS
(
select id from lineitem li where li.coupon_id = 133 and li.order_id = o.id)
)
OR EXISTS
(
select id from payments where...
)
從嵌套查詢中刪除“ GROUP BYorders.id”后,它已成功運行。 但是找不到在嵌套查詢中它不適用於Group By的原因。
希望這對其他人有幫助。
謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.