ORDER BY RAND() in MySQL verstehen
Während die Syntax von ORDER BY RAND() unkompliziert erscheint, können ihre internen Abläufe rätselhaft sein. Dieser Artikel befasst sich mit der Mechanik hinter diesem Vorgang und geht auf einige unerwartete Leistungsunterschiede ein.
Wie ORDER BY RAND() funktioniert
Anfangs glaubte man, dass ORDER BY RAND () hat der Tabelle eine Spalte mit Zufallswerten hinzugefügt und darauf basierend sortiert. Nachfolgende Untersuchungen ergaben jedoch, dass Jays vorgeschlagene Methode deutlich schneller ist:
SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;
Diese Methode generiert eine zufällige ID innerhalb des Bereichs vorhandener IDs und ruft die erste übereinstimmende Zeile ab.
Leistungsschwankungen
Interessanterweise variiert die Leistung von ORDER BY RAND() je nach den im Ergebnis enthaltenen Spalten:
SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 seconds*/ SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 seconds*/ SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 seconds*/
Diese Diskrepanz kann auf die Indizierung zurückgeführt werden. Die ID-Spalte ist indiziert, sodass sie schnell abgerufen werden kann. Das Hinzufügen des Benutzernamens zum Ergebnis erfordert das Lesen aus jeder Zeile, was den Vorgang verlangsamt. Im Fall von * müssen alle Spalten, auch solche mit variabler Länge, in den Speicher geladen werden, was sich weiter auf die Leistung auswirkt.
Alternativen für die schnelle Zufallsauswahl
Für Für eine effiziente zufällige Zeilenauswahl sollten Sie die folgenden Alternativen in Betracht ziehen:
SELECT id FROM table ORDER BY RAND() LIMIT 1; SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;
Das obige ist der detaillierte Inhalt vonWie funktioniert ORDER BY RAND() in MySQL und warum ist es so langsam?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!