Союз как подзапрос MySQL - PullRequest
       9

Союз как подзапрос MySQL

5 голосов
/ 21 июля 2009

Я хочу оптимизировать запрос, используя объединение в качестве подзапроса. Я не совсем уверен, как построить запрос, хотя. Я использую MYSQL 5

Вот оригинальный запрос:

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.

1 Ответ

4 голосов
/ 21 июля 2009
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...