2013-10-19 65 views
1

我有型MySQL的選擇在哪裏(子查詢)的

select some_value FROM table WHERE (subquery) IN (values) 

的MySQL查詢這似乎是緩慢的極端!

我有一個與訂單和第二個與他們的相應處理狀態的MySQL表。我現在要顯示所有訂單的最後狀態碼= 1。

表順序(ID =主鍵)

id | value 
---+------- 
1 + 10 
2 + 12 
3 + 14 

表狀態(ID =主鍵)

id | orderid | code 
---+---------+------- 
1 + 1  + 1 
2 + 2  + 1 
3 + 2  + 2 
4 + 1  + 3 
5 + 3  + 1 

我的查詢是:

select order.id FROM order WHERE 
(select state.code FROM state WHERE state.orderid = order.id ORDER BY state.id DESC LIMIT 0,1)  IN ('1') 

大致需要15秒處理這一個單一的訂單。如何修改mysql語句以加快查詢處理時間?

回答

1

更新

試試這個:

select s1.orderid 
from state s1 
left outer join state s2 on s1.orderid = s2.orderid 
    and s2.id > s1.id 
where s1.code = 1 
    and s2.id is null 

您可能需要在state.orderid的索引。

SQL Fiddle Example

CREATE TABLE state 
    (`id` int, `orderid` int, `code` int) 
; 

INSERT INTO state 
    (`id`, `orderid`, `code`) 
VALUES 
    (1, 1, 1), 
    (2, 2, 1), 
    (3, 2, 2), 
    (4, 1, 3), 
    (5, 3, 1) 
; 

查詢

select s1.orderid 
from state s1 
left outer join state s2 on s1.orderid = s2.orderid 
    and s2.id > s1.id 
where s1.code = 1 
    and s2.id is null 

結果

| ORDERID | 
|---------| 
|  3 | 
+0

在此我僅會得到一個訂單,因爲限制0,1作用於所有與所有州的訂單。 – user2898068

+0

對不起,沒有足夠好的閱讀這個問題。嘗試我更新的查詢。 – RedFilter

+0

謝謝。它工作得非常快!但是,當我在state.orderid上應用索引時,執行時間「傾向於爲零」。你能否評論這個索引的行爲,以及爲什麼這會極大地提高查詢速度? – user2898068

1
在這種情況下

我想你可以簡單地忘記order,因爲所有信息保留在state

SELECT x.id, x.orderid 
FROM state AS x 
WHERE x.code =1 
AND x.id = (
SELECT max(id) 
FROM a 
WHERE orderid = x.orderid) 

也許將有可能改變你的CRUD直接把過去的狀態order表太多,這將是更好的