此查询大约需要5到10秒才能运行,这对于呈现网页是不可接受的:
SELECT part . * , brand . *
FROM `part` , `model2year2part` , `brand2subcategory2part` , `brand2subcategory` , `brand`
WHERE `model2year2part`.`model2year_id` = '9521'
AND `model2year2part`.`part_id` = `part`.`id`
AND `brand2subcategory`.`subcategory_id` = '1'
AND `brand2subcategory2part`.`brand2subcategory_id` = `brand2subcategory`.`id`
AND `brand2subcategory2part`.`part_id` = `part`.`id`
AND `brand`.`id` = `part`.`brand_id`
ANSIfied:
SELECT p.*,
b.*
FROM PART p
JOIN brand b ON b.id = p.brand_id
JOIN model2year2part m ON m.part_id = p.id
JOIN brand2subcategory2part b2p ON b2p.part_id = p.id
JOIN brand2subcategory b2 ON b2.id = b2.brand2subcategory_id
WHERE m.model2year_id = '9521'
AND b2.subcategory_id = '1'
无论您向model2year2part
。model2year_id
和brand2subcategory
。subcategory_id
投放什么作为输入。
查询的EXPLAIN结果:http://i.stack.imgur.com/aYtXl.jpg
我已经为所有5个表做了所有可能的索引/唯一索引。
每个表格中的总记录数:
可能是罪魁祸首?有没有办法优化此查询而不是硬件升级?
答案 0 :(得分:1)
首先,我注意到你的第四个Join子句中的错误:
ON b2.id = b2.brand2subcategory_id
我假设这应该是:
ON b2.id = b2p.brand2subcategory_id
其次,您可以尝试从输出所需的过滤连接中分离出过滤连接。这允许您自己对子查询进行解释,以查看可能导致问题的原因:
Select P.*, B.*
From Part As P
Join Brand As B
On B.Id = P.brand_Id
Where P.part_id In (
Select M1.part_Id
From mode2year2part As M1
Join brand2subcategory2part As B2P
On B2P.part_id = M1.part_id
Join brand2subcategory As B2
On B2.Id = B2P.brand2subcategory_id
Where m1.model2year_id = '9521'
And B2.subcategory_id = '1'
)