用于SELECT FROM多个表的MySQL优化具有相当多的AND运算?

时间:2011-01-15 04:53:45

标签: sql mysql performance query-optimization

此查询大约需要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'

无论您向model2year2partmodel2year_idbrand2subcategorysubcategory_id投放什么作为输入。

查询的EXPLAIN结果http://i.stack.imgur.com/aYtXl.jpg

我已经为所有5个表做了所有可能的索引/唯一索引。

每个表格中的总记录数:

  • 部分:728,534
  • model2year2part :15,012,595(这是罪魁祸首?)
  • brand2subcategory2part :729,030
  • brand2subcategory :8,111
  • 品牌:875

可能是罪魁祸首?有没有办法优化此查询而不是硬件升级?

1 个答案:

答案 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'
                        )