Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie funktioniert ORDER BY RAND() von MySQL?

Obwohl es so etwas wie eine „schnelle Bestellung per Rand()“ nicht gibt, gibt es eine Problemumgehung für Ihre spezielle Aufgabe.

Um eine einzelne zufällige Zeile zu erhalten , kannst du es wie dieser deutsche Blogger machen:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- Fallstudie-von-Alternativen/ (Ich konnte keine Hotlink-URL sehen. Wenn jemand eine sieht, können Sie den Link gerne bearbeiten.)

Der Text ist auf deutsch, aber der SQL-Code steht etwas weiter unten und in großen weißen Kästchen, so dass er nicht schwer zu erkennen ist.

Im Grunde macht er eine Prozedur, die die Aufgabe erfüllt, eine gültige Zeile zu erhalten. Dadurch wird eine Zufallszahl zwischen 0 und max_id generiert. Versuchen Sie, eine Zeile abzurufen, und wenn sie nicht existiert, fahren Sie fort, bis Sie eine finden, die existiert. Er ermöglicht das Abrufen einer x-Anzahl von zufälligen Zeilen, indem er sie in einer temporären Tabelle speichert, sodass Sie die Prozedur wahrscheinlich so umschreiben können, dass sie etwas schneller ist und nur eine Zeile abgerufen wird.

Der Nachteil davon ist, dass wenn Sie VIELE Zeilen löschen und es große Lücken gibt, die Chancen groß sind, dass es viele Male verfehlt, was es unwirksam macht.

Update:Unterschiedliche Ausführungszeiten

Es kann mit der Indizierung zu tun haben. id ist indiziert und schnell zugänglich, während username hinzugefügt wird zum Ergebnis, bedeutet, dass es das aus jeder Zeile lesen und in die Speichertabelle einfügen muss. Mit dem * Es muss auch alles in den Speicher lesen, aber es muss nicht um die Datendatei herumspringen, was bedeutet, dass keine Zeit mit Suchen verloren geht.

Dies macht nur einen Unterschied, wenn Spalten mit variabler Länge (varchar/text) vorhanden sind, was bedeutet, dass die Länge überprüft und dann diese Länge übersprungen werden muss, anstatt nur eine festgelegte Länge (oder 0) zwischen jeder Zeile zu überspringen.