2015-05-04 115 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