SQL查询优化建议的产品

时间:2012-11-25 14:40:38

标签: sql optimization

我现在将尝试更好地解释以下问题和查询的目的是什么。 我们假设我们正在讨论电子商务环境和数据库。我们有三个表:产品,订单和orders_data。 ORDERS表将处理所有已下订单和一个子表,我们称之为ORDERS_DATA将存储订单中记录的所有产品。

按照表格定义,我的问题没有那些无用的字段:

    ORDERS (*id*, date, totale, ...);
    ORDERS_DATA (id_order, id_product, ...);
    PRODUCTS (id, name, ...);

ORDERS 中的主键是 id ,而在ORDERS_DATA中,键是(id_order,id_product)

对于查询,我想要检索的是 PRODUCT ID (在产品页面或购物车页面上浏览时),建议的产品基于ORDERS_DATA表。该查询将返回所有生活在这些订单中的id_product,其中至少有一个产品是给定的 PRODUCT ID

为了简洁起见,我将举例说明。假设我们在ORDERS_DATA中有这些ROW:

R1(1, 1); R2(1, 2); R3(1, 3); R4(2, 2), R5(2, 5); R6(3, 3);

我想要产品ID = 2的建议我的查询将返回ID:1和3(来自R1和R3 - 它们共享相同的订单ID,此订单还有产品2 - 来自R2 - 顺便提一下其产品)和产品5归功于订单号2.订单号3将被忽略。

这是我写的查询,但我很确定它不是性能和风格上最好的。

SELECT 
    A.id_product, COUNT( A.id_product ) AS num
FROM  
    orders_data A, orders_data B
WHERE 
    A.id_order = B.id_order
    AND B.id_product IN  (*IDs-HERE*)
    AND A.id_product NOT IN (*IDs-HERE*)
GROUP BY A.id_product

我已经使用了INNER JOIN语法,但性能没有任何变化。 查询在IN claumole中只有一个产品ID,需要0,0022秒。性能将随着多个产品ID而呈指数下降(例如在购物车页面中,产品中包含更多产品)。

感谢。

1 个答案:

答案 0 :(得分:0)

尝试使用JOIN测试替换EXISTS

SELECT
   id_product,
   COUNT(1) As num
FROM
   orders_data As A
WHERE
   id_product NOT IN (*IDs HERE*)
And
   Exists
   (
      SELECT 1
      FROM orders_data As B
      WHERE B.id_order = A.id_order
      And B.id_product IN (*IDs HERE*)
   )
GROUP BY
   id_product