通过查询优化组

时间:2014-02-03 11:09:12

标签: mysql sql database

我认为我的问题的解决方案应该不难,但我现在感到头痛,因为我自己找不到解决方案。

对于网上商店,我正在尝试创建一个简单的查询,选择特定类别中所有产品的最低和最高价格。现在,我现在的问题是,几乎所有产品都有不同的类型(比方说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

3 个答案:

答案 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以获取样本数据和查询结果。

希望这能解决您的问题!