use*_*073 6 mysql sql performance select query-optimization
我有三个表:产品(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)
Run Code Online (Sandbox Code Playgroud)
但它非常缓慢.然后我用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
Run Code Online (Sandbox Code Playgroud)
但它仍然很慢:查询在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
Run Code Online (Sandbox Code Playgroud)
试试这个:
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
Run Code Online (Sandbox Code Playgroud)
运行此查询,如果仍然面临查询,则比添加EXPLAIN上述查询的计划要慢
您必须在列上创建INDEX以提高性能.
在表的product_id列上创建索引product_value
在表的product_attribute_id列上创建索引product_value
| 归档时间: |
|
| 查看次数: |
20055 次 |
| 最近记录: |