Heim > Datenbank > MySQL-Tutorial > Hauptteil

Wie funktioniert ORDER BY RAND() in MySQL und warum ist es so langsam?

Barbara Streisand
Freigeben: 2024-11-04 06:07:01
Original
562 Leute haben es durchsucht

How Does ORDER BY RAND() Work in MySQL, and Why Is It So Slow?

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;
Nach dem Login kopieren

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*/
Nach dem Login kopieren

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:

  • Das im deutschen Blogger-Archiv beschriebene Verfahren (web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql- order-by-rand-a-case-study-of-alternates/).
  • Verwenden Sie Jays Methode trotz ihrer erhöhten Komplexität für optimale Geschwindigkeit.
  • Verwenden Sie den folgenden Zwei-Abfrage-Ansatz der Einfachheit halber:
SELECT id FROM table ORDER BY RAND() LIMIT 1;
SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage