2015-05-04 110 views
0

我創建了一個查詢來獲取非銷售產品。在這裏,我們有兩個主表,一個是產品表,另一個是order_product表。要獲取非銷售產品,我想從產品表中獲取那些不存在於order_product表中的產品。這個查詢在localhost上工作正常,但是當我在主服務器上使用它時,需要更長的時間並且由於這種超時發生。我怎麼能提高這個查詢的速度或優化我的查詢。查詢運行時間更長

SELECT p.date_added, p.model, p.status, p.quantity, ptc.category_id, pd.name AS product_name, cd.name AS category_name FROM (`product` p INNER JOIN `product_description` pd ON p.product_id= pd.product_id) INNER JOIN (`product_to_category` ptc INNER JOIN `category_description` cd ON ptc.category_id = cd.category_id) ON p.product_id = ptc.product_id 
     WHERE p.product_id NOT IN (SELECT product_id FROM `order_product`) 
      ORDER BY p.quantity DESC LIMIT 1,100 

回答

1

下面是該查詢的其他版本不使用not in

SELECT 
p.date_added, 
p.model, 
p.status, 
p.quantity, 
ptc.category_id, 
pd.name AS product_name, 
cd.name AS category_name 
FROM `product` p 
INNER JOIN `product_description` pd ON p.product_id= pd.product_id 
INNER JOIN `product_to_category` ptc ON p.product_id = ptc.product_id 
INNER JOIN `category_description` cd ON ptc.category_id = cd.category_id 
left join `order_product` op on op.product_id = p.product_id 
WHERE 
op.product_id is null 
ORDER BY p.quantity DESC LIMIT 1,100 

你需要確保所有加盟條件對應的列被編入索引,以及需要解決地方和order by

alter table product add index quantity_idx(quantity); 
alter table order_product add index product_id_idx(product_id); 

您可以使用以下2個指標210來檢查查詢健康狀況。

+0

注:索引是強制性的。 – Vinay

0

這可能是IN語句需要時間來執行。 我一起去外連接在這裏:

SELECT p.date_added, p.model, p.status, p.quantity, ptc.category_id, pd.name AS product_name, cd.name AS category_name FROM `product` p INNER JOIN `product_description` pd ON p.product_id= pd.product_id INNER JOIN `product_to_category` ptc INNER JOIN `category_description` cd ON ptc.category_id = cd.category_id ON p.product_id = ptc.product_id 
    LEFT OUTER JOIN `order_product` op ON p.product_id = op.product_id WHERE op.order_product_id IS NULL 
      ORDER BY p.quantity DESC LIMIT 1,100