【发布时间】:2014-01-21 22:52:45
【问题描述】:
我有三个表: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
【问题讨论】:
-
你想从这个查询中得到什么信息?
-
解释您的查询和更新
-
你的表有索引吗?
标签: mysql sql performance select query-optimization