2010-09-24 2 views
1

У меня есть следующий SQL:Необходимо оптимизировать вложенный оператор выбора

SELECT customfieldvalue.ISSUE 
FROM customfieldvalue 
WHERE customfieldvalue.STRINGVALUE 
IN (SELECT customfieldvalue.STRINGVALUE 
    FROM customfieldvalue 
    WHERE customfieldvalue.CUSTOMFIELD = "10670" 
    GROUP BY customfieldvalue.STRINGVALUE 
    HAVING COUNT(*) > 1); 

внутренней вложенной SELECT возвращает 3265 строк в 1.5secs на MySQL 5.0.77 при запуске на своем собственном. Таблица customfieldvalue содержит 2286831 строки.

Я хочу вернуть все значения столбца ISSUE, где значение столбца STRINGISSUE не является исключительным для этой строки, а столбец CUSTOMFIELD содержит «10670».

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

+0

вместо использования count (*) использовать счет (1) –

ответ

0

попробовать что-то вдоль этих линий:

SELECT cfv1.ISSUE 
    COUNT(cfv2.STRINGVALUE) as indicator 

    FROM customfieldvalue cfv1 

    INNER JOIN customfieldvalue cfv2 
    ON cfv1.STRINGVALUE = cfv2.STRINGVALUE AND cfv2.CUSTOMFIELD = "10670" 

    GROUP BY cfv1.ISSUE 
    HAVING indicator > 1 

Это, вероятно, не работает на копии & пасты, как я не проверял, но в MySQL JOIN и являются часто гораздо быстрее, чем подзапросы, даже порядки величины.

+0

Я согласен, что соединение должно быть быстрее здесь. –

+0

Последующая обработка для удаления дубликатов на основе JOINs будет влиять на ваш воспринимаемый ускорение скорости. В зависимости от количества задействованных строк, но чем больше набор данных, тем более вероятно, что этот подход не будет масштабироваться. Используйте инструмент, подходящий для задания, путем проверки плана EXPLAIN и сравнения - не на основе мифов типа «JOINs всегда быстрее», а «подзапросы - плохие». –

+0

@OMG: Я добавил слово «часто», чтобы вы чувствовали себя лучше. В любом случае, что сравнивать, если вам не с чем сравнивать. –

Смежные вопросы