Heim  >  Artikel  >  Datenbank  >  Warum hat „ORDER BY RAND()“ in MySQL eine so unvorhersehbare Leistung?

Warum hat „ORDER BY RAND()“ in MySQL eine so unvorhersehbare Leistung?

Susan Sarandon
Susan SarandonOriginal
2024-11-04 03:58:30470Durchsuche

Why Does `ORDER BY RAND()` Have Such Unpredictable Performance in MySQL?

Eintauchen in MySQLs ORDER BY RAND() und seine Leistungsüberraschungen

Einführung
ORDER BY RAND( ) ist ein häufig verwendetes Konstrukt in MySQL, um zufällige Zeilen aus einer Tabelle abzurufen. Hinter dieser scheinbar einfachen Syntax verbirgt sich jedoch ein komplexer Mechanismus, der zu unerwarteten Leistungsschwankungen führen kann. Dieser Artikel befasst sich mit dem Innenleben von ORDER BY RAND() und versucht, einige seiner rätselhaften Verhaltensweisen zu erklären.

Unerwartete Ergebnisse mit ORDER BY RAND()
Es treten kontraintuitive Leistungsunterschiede auf wenn ORDER BY RAND() für Spalten mit unterschiedlichen Datentypen verwendet wird. Die folgenden Abfragen veranschaulichen dieses Phänomen:

  • SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 Sekunden*/
  • SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0,25 Sekunden*/
  • SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 Sekunden*/

Trotz der Sortierung nach einer einzelnen Spalte in allen drei Abfragen variieren die Ausführungszeiten drastisch. Dies wirft Fragen zum zugrunde liegenden Mechanismus und seiner Abhängigkeit von Datenmerkmalen auf.

Jays Lösung: Schnelle Zufallsauswahl
Um die Leistungsbedenken auszuräumen, hat Jay eine alternative Methode vorgeschlagen:

<code class="sql">SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;</code>

Diese Abfrage übertrifft den herkömmlichen ORDER BY RAND()-Ansatz deutlich und bietet eine effizientere Methode zur Auswahl zufälliger Daten. Während diese Methode das Leistungsproblem angeht, führt sie zu Komplexität und ist möglicherweise nicht immer in allen Szenarien durchführbar.

Verstehen der Leistungsschwankungen
Die unterschiedlichen Ausführungszeiten, die für ORDER BY RAND beobachtet wurden( )-Abfragen können durch die Indizierungsfunktionen von MySQL erklärt werden. Indizierte Spalten, wie in diesem Fall id, ermöglichen einen schnelleren Zugriff auf Daten, was zu einer schnelleren Ausführung führt. Beim Abrufen mehrerer Spalten, z. B. in SELECT id, username FROM table ORDER BY RAND() LIMIT 1;, muss MySQL die Werte für beide Spalten abrufen, was die Ausführungszeit erhöht.

Fazit
Während ORDER BY RAND() weiterhin ein nützliches Werkzeug zum Abrufen zufälliger Zeilen ist, ist es wichtig, seine Auswirkungen auf die Leistung zu verstehen. Durch die Berücksichtigung der beteiligten Datentypen und die Nutzung alternativer Methoden bei Bedarf können Entwickler ihre Abfragen optimieren und schnellere Ergebnisse erzielen.

Das obige ist der detaillierte Inhalt vonWarum hat „ORDER BY RAND()“ in MySQL eine so unvorhersehbare Leistung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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