Wie optimiert man eine MySQL-Abfrage, die sich selbst verbindet und eine "benutzerdefinierte" Gruppe durchführt?
Ich habe die folgende Abfrage, die langsam zu werden beginnt, wenn die Größe der DB-Tabelle zunimmt:
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
Zunächst wähle ich alles aus Übersetzungen aus, um mir den entsprechenden englischen Wert auch zu verschaffen.
Dann möchte ich meine Ergebnisse auf nur einen pro PropertyKey beschränken. Dies ist wie eine Gruppe von, außer dass ich einen bestimmten Datensatz auswählen muss, um den zurückzugebenden Datensatz zu erhalten (anstelle der Art und Weise, wie group by mir nur den ersten ausgibt, den es findet). Aus diesem Grund habe ich die innere Abfrage, die nur eine TranslationId zurückgibt.
Beim Ausführen von EXPLAIN erhalte ich die folgenden Informationen:
Gibt es eine Möglichkeit, die gleichen Ergebnisse zurückzugeben, ohne dass MySQL eine langsamere abgeleitete Tabelle verwenden muss? Vielen Dank!
AKTUALISIEREN: Ich habe eine SQL-Geige mit einem Schema und Beispieldaten erstellt. Sie können meine Abfrage selbst ausführen, um die Ergebnisse anzuzeigen. Ich muss in der Lage sein, die gleichen Ergebnisse zu erzielen, hoffentlich schneller.http://sqlfiddle.com/#!2/44eb0/3/0