2013-05-09 1 views
0

У меня есть следующий запрос, который начинает становиться медленным, как размер таблицы увеличивается БД:Как вы оптимизируете запрос MySQL, который объединяется сам по себе и выполняет ли «настраиваемую» группу?

SELECT 
    t.*, 
    e.TranslatedValue AS EnglishValue 
FROM (
    SELECT DISTINCT PropertyKey 
    FROM Translations 
) grouper 
JOIN Translations t 
    ON t.TranslationId = (
     SELECT TranslationId 
     FROM Translations gt 
     WHERE gt.PropertyKey = grouper.PropertyKey 
      AND gt.Locale = 'es' 
      AND gt.Priority = 3 
     ORDER BY gt.ModifiedDate DESC 
     LIMIT 1 
    ) 
INNER JOIN Translations e 
    ON t.EnglishTranslationId = e.TranslationId 
ORDER BY t.ReviewerValidated, PropertyKey 

Первый, я выбрать все, от переводов, вместе с собой, чтобы мне соответствующее английское значение также.

Затем я хочу ограничить свои результаты только одним в PropertyKey. Это похоже на группу, за исключением того, что мне нужно выбрать конкретную запись, которая будет возвращена (вместо того, чтобы группа просто дала мне первую, которую она обнаружила). Вот почему у меня есть внутренний запрос, который просто возвращает один TranslationId.

Когда я бег объяснить я получаю следующую информацию:

enter image description here

Есть ли способ, что я могу возвращать тот же набор результатов без необходимости иметь MySQL использовать медленнее производную таблицу? Благодаря!

UPDATE: Я создал SQL скрипку со схемой и выборки данных. Вы можете запустить мой запрос для себя, чтобы увидеть результаты, которые он дает. Мне нужно быть , способным получить те же результаты, надеюсь, быстрее. http://sqlfiddle.com/#!2/44eb0/3/0

+0

Можете ли вы предоставить образцы данных и результаты, которые вы хотите? –

+0

MySQL должен жаловаться при выполнении запроса, поскольку PropertyKey в предложении ORDER BY неоднозначен (их три, даже если они равны). – newtover

+0

@newtover - он не будет жаловаться, потому что на этом уровне есть только один PropertyKey (другие - в подзапросах). Если вы хотите придерживаться t. перед ним для ясности, это прекрасно. – 11101101b

ответ

0

Я думаю, что вы хотите самый последний TranslatedValue для данного локального и приоритета, который соответствует PropertyKey в записи.

Если да, то следующий делает то, что вы хотите, используя один связанный подзапрос: (. Оговорка having исключает записи без перевода)

select t.*, 
     (select t2.TranslatedValue 
     from Translations t2 
     where t.PropertyKey = t2.PropertyKey and 
       t2.Locale = 'es' and 
       t2.Priority = 3 
     order by t.ModifiedDate desc 
     limit 1 
     ) as EnglishValue 
from Translations t 
having EnglishValue is not NULL 
ORDER BY t.ReviewerValidated, PropertyKey; 

Если это так, то индекс на Translations(PropertyKey, Locale, Priority, ModifiedDate) должен ускорить запрос.

+0

Спасибо @Gordon Linoff, но я до сих пор не получаю Что мне нужно. Сначала мне пришлось слегка изменить ваш запрос: t2.Locale = 'es' и t2.Priority = 3 следует изменить на t.Locale = 'es' и t.Priority = 3. Мне также пришлось добавить, где t2.Locale = 'en', потому что в моем поле EnglishValue я получал всевозможные языки. Теперь данные точно такие же, как и мой запрос, за исключением того, что на PropertyKey все еще есть дубликаты. – 11101101b

+0

@ 11101101b. , , Конечно, в 'PropertyKey' есть дубликаты. Вы не делаете окончательную группировку. Вы можете добавить 'group by PropertyKey', если это то, что вы хотите. –

+0

Я пробовал @Gordon Linoff, но вы должны делать группу до того, как у вас есть и у вас есть заказ (который не дает мне то, что я хочу). – 11101101b

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