2009-07-21 28 views
5

Tôi muốn tối ưu hóa truy vấn bằng cách sử dụng liên kết làm truy vấn phụ. Im không thực sự chắc chắn làm thế nào để xây dựng các truy vấn mặc dù. Tôi đang sử dụng MYSQL 5Liên minh dưới dạng truy vấn phụ MySQL

Đây là truy vấn ban đầu:

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 

Những gì tôi muốn làm là thay thế ((Parts_Category.category_id = '508' OR Parts_Category.main_category_id ='508') phần này với sự kết hợp dưới đây. Bằng cách này tôi có thể thả mệnh đề GROUP BY và sử dụng các chỉ mục col thẳng để cải thiện hiệu suất. Các bảng phân loại các bộ phận và phụ tùng chứa nửa triệu bản ghi, vì vậy mọi lợi ích sẽ là tuyệt vời.

(
    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 
) 

Ai có thể cho tôi manh mối về cách viết lại không? Tôi đã cố gắng hàng giờ nhưng không thể có được nó vì tôi chỉ khá mới với MySQL.

Trả lời

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 

Lưu ý rằng MySQL có thể sử dụng Index Merge và bạn có thể viết lại truy vấn của bạn như thế này:

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 

, đó sẽ hiệu quả hơn nếu bạn có các chỉ số sau:

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

Nhờ bao giờ rất nhiều Quassnoi. FY1 trên một danh mục hàng 62.000 truy vấn trả về khoảng 1 giây nhanh hơn! – gus

+0

Tôi nghĩ rằng trong ví dụ thứ hai của bạn tôi sẽ phải thêm một GROUP BY Parts.id như tôi không muốn các bản sao mà một phần có thể được liệt kê trong các thể loại khác. Đó là ý tưởng đằng sau việc sử dụng Union. Tôi sẽ so sánh hiệu suất anyway. Cảm ơn một lần nữa. – gus

+0

GROUP BY là cần thiết trong ví dụ thứ hai và nếu thêm tôi nhận được cùng một vấn đề - filesort và sử dụng temp từ giải thích. – gus

Các vấn đề liên quan