Jetzt besteht die Anforderung, jeweils drei Wörter zufällig aus einer Wortliste auszuwählen.
Die Anweisung zur Tabellenerstellung dieser Tabelle lautet wie folgt:
mysql> Create table 'words'( 'id' int(11) not null auto_increment; 'word' varchar(64) default null; primary key ('id') ) ENGINE=InnoDB;
Dann fügen wir 10.000 Datenzeilen ein. Als nächstes sehen wir uns an, wie man zufällig drei Wörter daraus auswählt.
Zuerst denken wir normalerweise daran, order by rand() zu verwenden, um diese Logik zu implementieren:
mysql> select word from words order by rand() limit 3;
Obwohl dieser Satz sehr einfach ist, ist der Ausführungsprozess komplizierter. Wir verwenden „explain“, um die Ausführung der Anweisung zu sehen: Die Verwendung von „temporär“ im Feld „Extra“ zeigt an, dass eine temporäre Tabelle verwendet werden muss, und „Using filesort“ gibt an, dass eine Sortierung erforderlich ist. Das heißt, es ist ein Sortiervorgang erforderlich.
Für InnoDB-Tabellen
kann die Durchführung einer vollständigen Feldsortierung den Festplattenzugriff reduzieren, daher wird sie bevorzugt.Bei Speichertabellen greift der Tabellenrückgabeprozess einfach direkt auf den Speicher zu, um die Daten basierend auf der Position der Datenzeilen abzurufen, was überhaupt nicht zu mehreren Festplattenzugriffen führt
. Daher wird MySQL zu diesem Zeitpunkt der Rowid-Sortierung Priorität einräumen.
Lassen Sie uns den Ausführungsprozess dieser Anweisung klären:
Diese Tabelle verwendet die Speicher-Engine. Das erste Feld ist vom Typ Double B. R, das zweite Feld ist vom Typ varchar(64) und als W gekennzeichnet. Und diese Tabelle hat keinen Index.
Extrahieren Sie alle Wörter aus der Worttabelle in der Reihenfolge des Primärschlüssels. Rufen Sie für jedes Wort die Funktion rand() auf, um zufällig eine zufällige Dezimalzahl größer als 0 und kleiner als 1 zu generieren, und speichern Sie die zufällige Dezimalzahl und das Wort jeweils in den Feldern R und W der temporären Tabelle.
Die oben genannten Standortinformationen sind tatsächlich der Standort der Zeile, bei dem es sich um die zuvor erwähnte Zeilen-ID handelt.
Für die InnoDB-Engine gibt es zwei Verarbeitungsmethoden für Tabellen mit oder ohne Primärschlüssel:
Für
InnoDB-Tabellen mit Primärschlüsselnist diese Zeilen-ID die Primärschlüssel-ID
Fürohne Primärschlüssel Bei InnoDB-Tabellen wird diese Zeilen-ID vom System generiert und zur Identifizierung verschiedener Zeilen verwendet.
order by randn() eine temporäre Speichertabelle, und die Sortiermethode der temporären Speichertabelle verwendet die Rowid-Sortiermethode.
3. Temporäre FestplattentabelleNicht alle temporären Tabellen sind temporäre Speichertabellen. Die Konfiguration „tmp_table_size“ begrenzt die Größe der temporären Speichertabelle. Wenn diese Größe überschritten wird, wird die temporäre Tabelle der Festplatte verwendet. Die InnoDB-Engine verwendet standardmäßig temporäre Festplattentabellen
. 4. Sortieralgorithmus der PrioritätswarteschlangeNach MySQL 5.6 wurde der Algorithmus zur Sortierung der Prioritätswarteschlange eingeführt. Dieser Algorithmus erfordert keine Verwendung temporärer Dateien. Der ursprüngliche Zusammenführungssortierungsalgorithmus erfordert die Verwendung temporärer Dateien. Denn wenn Sie den Zusammenführungsalgorithmus verwenden, müssen Sie eigentlich nur die Top 3 erreichen, aber wenn Ihnen die Zusammenführungssortierung ausgeht, ist das Ganze bereits in Ordnung, was zu einer Verschwendung von Ressourcen führt.
Der Sortieralgorithmus der Prioritätswarteschlange kann nur die ersten drei übernehmen, und der Ausführungsprozess ist wie folgt:Um diese 10.000 (R, Zeilen-ID) zu sortieren, nehmen Sie zuerst die ersten drei Zeilen, erstellen Sie einen Heap und Setzen Sie den größten Wert an die Spitze des Heaps.
Nehmen Sie die nächste Zeile (R’, rowid’) und vergleichen Sie sie mit dem größten R im aktuellen Heap. Entfernen Sie (R, rowid) aus dem Heap und ersetzen Sie es durch (R’,rowid’).Aber wenn die Anzahl der Grenzwerte relativ groß ist, ist es schwieriger, den Heap aufrechtzuerhalten, sodass der Zusammenführungssortierungsalgorithmus verwendet wird.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Zufallsextraktion in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!