簡體   English   中英

查詢時間過長

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

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