2009-07-21 67 views
5

我想优化使用联合作为子查询的查询。我不知道如何构建查询。我使用MYSQL 5作为子查询的联盟MySQL

这里是原始查询:

SELECT Parts.id 
FROM Parts_Category, Parts 
    LEFT JOIN Image ON Parts.image_id = Image.id 
WHERE 
( 
    (
     Parts_Category.category_id = '508' OR 
     Parts_Category.main_category_id ='508' 
    ) AND 
    Parts.id = Parts_Category.Parts_id 
) AND 
Parts.status = 'A' 
GROUP BY 
    Parts.id 

我想要做的就是替换这个((Parts_Category.category_id = '508' OR Parts_Category.main_category_id ='508')部分与下面的工会。通过这种方式,我可以删除GROUP BY子句并使用应提高性能的直接col索引。零件和零件类别表包含五十万条记录,因此任何收益都会很大。

(
    SELECT * FROM 
    (
     (SELECT Parts_id FROM Parts_Category WHERE category_id = '508') 
     UNION 
     (SELECT Parts_id FROM Parts_Category WHERE main_category_id = '508') 
    ) 
    as Parts_id 
) 

有没有人可以给我一个关于如何重写它的线索?我已经尝试了几个小时,但不能得到它,因为我只是MySQL的新手。

回答

4
SELECT Parts.id 
FROM (
     SELECT parts_id 
     FROM Parts_Category 
     WHERE Parts_Category.category_id = '508' 
     UNION 
     SELECT parts_id 
     FROM Parts_Category 
     WHERE Parts_Category.main_category_id = '508' 
     ) pc 
JOIN Parts 
ON  parts.id = pc.parts_id 
     AND Parts.status = 'A' 
LEFT JOIN 
     Image 
ON  image.id = parts.image_id 

注意MySQL可以使用Index Merge,你可以重写查询,因为这:

SELECT Parts.id 
FROM (
     SELECT DISTINCT parts_id 
     FROM Parts_Category 
     WHERE Parts_Category.category_id = '508' 
       OR Parts_Category.main_category_id = '508' 
     ) pc 
JOIN Parts 
ON  parts.id = pc.parts_id 
     AND Parts.status = 'A' 
LEFT JOIN 
     Image 
ON  image.id = parts.image_id 

,这将是,如果你有以下的索引更高效:

Parts_Category (category_id, parts_id) 
Parts_Category (main_category_id, parts_id) 
+0

感谢曾经这么多Quassnoi。对于62,000行类别的FY1,查询返回时间大约快1秒! – gus 2009-07-21 14:31:41