MySQL: Extrahieren des endgültigen Eintrags aus jeder Datengruppe
Ein häufiger Datenbankvorgang umfasst das Abrufen des aktuellsten Datensatzes innerhalb jeder Datengruppe. Obwohl GROUP BY
häufig verwendet wird, kann es zu Leistungsproblemen führen.
Suboptimaler Ansatz
Die folgende Abfrage versucht Folgendes:
<code class="language-sql">SELECT * FROM (SELECT * FROM messages ORDER BY id DESC) AS x GROUP BY name</code>
Diese Methode ist ineffizient, da die äußere Abfrage die gesamte Tabelle nach jeder Gruppe durchsucht, unabhängig von effizienteren Alternativen.
Optimierte Lösung (MySQL 8.0)
MySQL 8.0 und spätere Versionen bieten Fensterfunktionen für verbesserte gruppenweise Vorgänge. ROW_NUMBER()
identifiziert effizient den letzten Datensatz in jeder Gruppe:
<code class="language-sql">WITH ranked_messages AS ( SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn FROM messages AS m ) SELECT * FROM ranked_messages WHERE rn = 1;</code>
Diese Abfrage ordnet jede Zeile innerhalb ihrer Gruppe und wählt dann jeweils nur den am höchsten bewerteten (letzten) Datensatz aus.
Alternative (Pre-MySQL 8.0)
Für ältere MySQL-Versionen (vor 8.0) ist dieser Ansatz geeignet:
<code class="language-sql">SELECT m1.* FROM messages m1 LEFT JOIN messages m2 ON (m1.name = m2.name AND m1.id < m2.id) WHERE m2.id IS NULL;</code>
Dabei wird ein LEFT JOIN
verwendet, um Zeilen ohne ein höheres id
innerhalb derselben Gruppe zu finden, wodurch der letzte Datensatz in jeder effektiv isoliert wird.
Leistungsüberlegungen
Die optimale Abfrage hängt stark von Ihrer Datengröße, Gruppenverteilung und vorhandenen Indizes ab. Das Benchmarking Ihres spezifischen Szenarios ist entscheidend für die Auswahl der effizientesten Lösung.
Das obige ist der detaillierte Inhalt vonWie kann ich den letzten Datensatz in jeder Gruppe in MySQL effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!