我认为我的问题的解决方案应该不难,但我现在感到头痛,因为我自己找不到解决方案。
对于网上商店,我正在尝试创建一个简单的查询,选择特定类别中所有产品的最低和最高价格。现在,我现在的问题是,几乎所有产品都有不同的类型(比方说40英寸电视,42英寸电视,46英寸)。我现在想做的是,当我试图获得所有产品的最低和最高价格时,只对每个product_id使用最低价格。我设法做到了,但是,由于Group By子句,查询太慢了。加载查询大约需要40秒。任何想法如何优化此查询?
SELECT MIN(product_price), MAX(product_price)
FROM products_inventory
WHERE inventory_id IN (
SELECT pi.inventory_id
FROM products_inventory pi
JOIN products p ON p.product_id = pi.product_id
JOIN category_products cp ON cp.product_id = p.product_id
WHERE cp.category_id IN (4,5,6,118)
GROUP BY product_id
ORDER BY product_price
)
表格如何显示的示例:
products: product_id, product_name
products_inventory: inventory_id, product_id, product_price
category_products: category_id, product_id
如上所述,这里有一些示例数据:
products:
1, lg tv
2, samsung tv
products_inventory
1, 1, 500
2, 1, 750
3, 1, 800
4, 2, 450
5, 2, 600
category_products
1, 1
1, 2
根据示例数据,查询的输出应为: 450 - 500
答案 0 :(得分:2)
好的,首先我发现您的查询与下面的查询之间没有任何区别:
SELECT MIN(product_price), MAX(product_price)
FROM products_inventory pi
JOIN products p ON p.product_id = pi.product_id
JOIN category_products cp ON cp.product_id = p.product_id
WHERE cp.category_id IN (4,5,6,118)
GROUP BY product_id
ORDER BY product_price
这应该以完全相同的方式工作,并且因为你避免无用的操作而具有更高的性能。
好吧,现在让我们提高性能(你说问题出在group by子句中)。
让我们信任你并通过添加覆盖索引来提高性能:
create index my_covering_index on products_inventory(product_id,product_price);
这类索引的重点是使用“where”子句中的所有内容,然后使用“group by”子句和“select”子句中的所有内容。
通常这应该足以增强您对本田汽车的查询:)
答案 1 :(得分:1)
它没有分组减慢你的速度,但是IN子句......当你使用IN时会发生什么,就像你对OR每个结果行一样......这是非常慢的。
你必须加入它,这要快得多:
SELECT MIN(pi.product_price), MAX(pi.product_price)
FROM products_inventory pi
JOIN products p ON p.product_id = pi.product_id
JOIN category_products cp ON cp.product_id = p.product_id
WHERE cp.category_id IN (4,5,6,118)
答案 2 :(得分:0)
Rafal Ziolkowski给出的答案是正确的,请查看SQL Fiddle以获取样本数据和查询结果。
希望这能解决您的问题!