我有三个表:product(10k条记录),product_attribute(4k条记录)和product_value(2m条记录)。 product和product_attribute通过product_value连接。
我想检索一个特定产品(例如product_id = 001)及其相应的属性名称和属性值。首先,我尝试

SELECT product.product_id, product_attribute.attribute_name, product_value.attribute_value

FROM product, product_attribute, product_value

WHERE product.product_id = 001 AND product.product_id = product_value.product_id AND product_attribute.product_attribute_id IN (SELECT product_value.product_attribute_id FROM product_value WHERE product_value.product_id = 001)

但这非常慢。然后我用INNER JOIN而不是IN
SELECT product.product_id, product_attribute.attribute_name,  product_value.attribute_value FROM product

INNER JOIN product_value ON product.product_id = 001 AND product.product_id = product_value.product_id

INNER JOIN product_attribute ON product_attribute.product_attribute_id = product_value.product_attribute_id WHERE product.product_id = 001

但这仍然很慢:查询在36分钟内返回31行!

有没有更好的解决方案来解决这个问题?

解释查询将给出:
*************************** 1. row ***********
           id: 1
  select_type: SIMPLE
        table: product_attribute
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 5247
        Extra:
*************************** 2. row ***********
           id: 1
  select_type: SIMPLE
        table: product
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 91818
        Extra: Using where; Using join buffer
*************************** 3. row ***********
           id: 1
  select_type: SIMPLE
        table: product_value
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1731016
        Extra: Using where; Using join buffer

最佳答案

试试这个:

SELECT p.product_id, pa.attribute_name, pv.attribute_value
FROM product p
INNER JOIN product_value pv ON p.product_id = pv.product_id
INNER JOIN product_attribute pa ON pa.product_attribute_id = pv.product_attribute_id
WHERE p.product_id = 001

运行此查询,如果您仍然面临该查询的速度比添加上述查询的EXPLAIN计划慢

您必须在列上创建索引以提高性能。
  • product_id
  • product_value列上创建索引
  • product_attribute_id
  • product_value列上创建索引

    关于即使使用INNER JOIN而不是IN,MySQL查询也非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20917717/

    10-10 00:16
    查看更多