Как вы оптимизируете 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.
Когда я запускаю объяснение, я получаю следующую информацию:
Есть ли способ вернуть тот же набор результатов без необходимости использовать MySQL более медленную производную таблицу? Спасибо!
ОБНОВИТЬ: Я создал SQL Fiddle со схемой и примерами данных. Вы можете запустить мой запрос для себя, чтобы увидеть результаты, которые он дает. Я должен быть в состоянии получить те же результаты, надеюсь, быстрее.http://sqlfiddle.com/#!2/44eb0/3/0