MySQL UNION против IN оговорка - PullRequest
1 голос
/ 09 июня 2009

Я пытался оптимизировать один из моих запросов, который выглядит следующим образом:

select toc.* from
    (select sender, max(convid) as maxconvid
     from MetaTable 
     where sender in ('arjunchow','aamir_alam')
     group by sender) as tmp1
    inner join MetaTable as toc on 
        toc.sender = tmp1.sender 
        and toc.convid = tmp1.maxconvid;

Когда сервер mysql находится в состоянии стресса, этот запрос обычно отвечает в течение 0,2 с, но когда количество идентификаторов «отправителя» в предложении IN увеличивается (> 50), запрос сильно замедляется (~ 5-6 с) ,

Желательно ли использовать несколько предложений объединения вместо предложения IN, учитывая, что мой запрос может стать объединением из 50 запросов. Так что мой запрос будет выглядеть так:

(SELECT 
    convId, 
    UNIX_TIMESTAMP(timeStamp) as timeStamp, 
    UNIX_TIMESTAMP(createTime) as createTime, 
    numMessages, 
    rootMsg, 
    sender, 
    ipormobile, 
    modIpOrMobile, 
    UNIX_TIMESTAMP(modTimeStamp) as modTimeStamp 
 from 
    MetaTable 
 where 
    sender='arjunchow' 
 ORDER BY convId DESC limit 1) 
UNION ALL 
(SELECT 
    convId, 
    UNIX_TIMESTAMP(timeStamp) as timeStamp, 
    UNIX_TIMESTAMP(createTime) as createTime, 
    numMessages, 
    rootMsg, 
    sender, 
    ipormobile, 
    modIpOrMobile, 
    UNIX_TIMESTAMP(modTimeStamp) as modTimeStamp 
 from 
    MetaTable 
 where 
    sender='aamir_alam' 
 ORDER BY convId DESC limit 1)

Ответы [ 2 ]

1 голос
/ 10 июня 2009

У меня была похожая проблема с поиском по тегам, и я имел возможность поговорить об этом с техническими специалистами MySQL; они рекомендовали, чтобы я создал временную таблицу и добавил к ней свои значения, когда вы перебираете пользователей, а затем выполняете любые необходимые операции с этой временной таблицей. Каждый раз, когда вы пытаетесь собрать все это в одну команду, она серьезно увязнет.

0 голосов
/ 09 июня 2009

Перепишите ваш запрос следующим образом:

SELECT  *
FROM    MetaTable
WHERE   (sender, convid) IN
        (
        SELECT  sender, MAX(convid) as maxconvid
        FROM    MetaTable
        WHERE   sender IN ('arjunchow','aamir_alam')
        GROUP BY
                sender
        )

, убедитесь, что у вас есть составной индекс на (sender, convid) и убедитесь, что он используется (т.е. в плане объяснения USING INDEX FOR GROUP BY)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...