2009-07-21 3 views
5

Я хочу оптимизировать запрос, используя объединение в качестве подзапроса. Я действительно не уверен, как построить запрос. Я использую MYSQL 5Union as sub query 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

Благодарности когда-либо так много Квасной. FY1 в категории категории 62 000, запрос возвращается примерно на 1 секунду быстрее! – gus

+0

Я думаю, что в вашем втором примере мне нужно будет добавить GROUP BY Parts.id, поскольку я не хочу дубликатов, где часть может быть указана в других категориях. Это была идея использования Союза. В любом случае, я сравню производительность. Еще раз спасибо. – gus

+0

GROUP BY понадобился во втором примере, и если добавить, я получаю ту же проблему - filesort и используя temp из Explain. – gus