2012-06-05 47 views
0

我不是sql的專家,我需要以下查詢的幫助。它很差,執行時間也很長。 是否有可能用JOIN()替換IN()以加快查詢速度? 如何做到這一點?Mysql查詢優化不佳

SELECT * 
FROM shop_orders 
WHERE id IN (SELECT orders_id 
       FROM shop_orders_data 
       WHERE closed = '1' /*AND backorder='0'*/) 
     AND id IN (SELECT orders_id 
        FROM shop_orders_products 
        WHERE products_id IN (SELECT id 
             FROM shop_products 
             WHERE artno = '120000' 
               OR name LIKE '%120000%')) 
ORDER BY created DESC 
+0

是的,這是可能的。 –

+2

嘗試添加您的表格結構和關鍵關係到您的文章(並接受您以前的問題的答案)。 – Crontab

回答

1
Select so.* 
from shop_orders as so 
    join shop_orders_data as sod on sod.orders_id = so.id 
    join (select orders_id 
      from shop_orders_products as sop 
        join shop_products as sp on sp.id = sop.products_id 
      where sp.artno = '120000' 
        OR sp.name like '%120000%') as sop on sop.orders_id = so.id 
where 
    sod.closed = '1' 
order by so.created desc 
+0

只需更新它,讓您加入已經減少的查詢結果。這應該使聯接操作更快,因爲它將有更少的行要通過。 這裏的主要想法是,在您的第一個查詢中,您有效地對錶中的每一行執行查詢。在這裏,您將執行合併操作,然後查詢表以查看它是否符合where子句中指定的條件。 – cDecker32

+0

查詢中有一個額外的「)」。工作正常!謝謝! – Oualid

+0

糟糕。對於那個很抱歉。希望它能幫助你更好地理解查詢。 – cDecker32

1

是的,你是在正確的道路上 - 你可以只是所有這些表,而不是這些在運營商之間的內部連接。

SELECT 
    so.* 
FROM 
    shop_orders so 
    INNER JOIN shop_orders_data sod 
     ON so.id = sod.orders_id 
    INNER JOIN shop_orders_products sop 
     ON sod.id = sop.orders_id 
    INNER JOIN shop_products sp 
     ON sop.products_id = sp.id 
WHERE sod.closed = '1' 
    AND (sp.artno = '120000' OR sp.name LIKE '%120000%') 
+4

隱式連接是一個sql反模式,不應在解決方案中推薦。 – HLGEM

+0

已更新爲顯式,但我不同意將隱式連接描述爲反模式。 –

+0

這很好。它可能需要'GROUP BY so.id'來刪除重複的結果。 –

2

我想這應該這樣做:

SELECT 
    s.* 
FROM 
    shop_orders s 
INNER JOIN 
    shop_orders_data od 
ON 
    s.id=od.orders_id 
INNER JOIN 
    shop_orders_products sop 
ON 
    s.id=sop.orders_id 
INNER JOIN 
    shop_products sp 
ON 
    sop.products_id=sp.id 
WHERE 
    od.closed=1 
AND 
    (sp.artno='120000' or sp.name LIKE '%120000%') 
3

我要說喜歡的是這裏造成的最大延遲......將在貨號不夠? LIKE通常是一個非常昂貴的過程。

+0

當你喜歡將通配符作爲第一個字符時,索引不能有效使用。 – HLGEM

+0

謝謝!現在它快得多。 – Oualid