2009-07-21 66 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