MySQLs ORDER BY RAND()
ist eine einfache Möglichkeit, zufällige Datenbankeinträge abzurufen. Das Abrufen mehrerer zufälligen Zeilen mit dieser Methode wird jedoch extrem langsam, insbesondere bei großen Datensätzen.
Betrachten Sie diese Abfrage mit dem Ziel, 18 zufällige Benutzerprofile auszuwählen:
<code class="language-sql">SELECT u.id, p.photo FROM users u, profiles p WHERE p.memberid = u.id AND p.photo != '' AND (u.ownership=1 OR u.stamp=1) ORDER BY RAND() LIMIT 18</code>
Die Ineffizienz ergibt sich aus der inhärenten Notwendigkeit von ORDER BY RAND()
, die gesamte Ergebnismenge zu sortieren, bevor die LIMIT
-Klausel angewendet wird.
Ein effizienterer Ansatz
Eine überlegene Strategie nutzt eine indizierte Spalte, um die Zufallsauswahl erheblich zu beschleunigen. Hier ist eine optimierte Abfrage:
<code class="language-sql">SELECT g.* FROM table g JOIN (SELECT id FROM table WHERE RAND() < (SELECT 4 / COUNT(*) ) * 10 LIMIT 4) AS subquery ON g.id = subquery.id;</code>
Erläuterung der Optimierungen
Diese überarbeitete Abfrage enthält mehrere wichtige Verbesserungen:
RAND()
gegen einen Prozentsatz der Gesamtzeilen. Die Indizierung der Spalte id
(oder der in der Klausel WHERE
verwendeten Spalte) ermöglicht eine schnelle Zeilenidentifizierung.LIMIT
-Klausel sowohl in der Unterabfrage (4) als auch in der Gesamtabfrage muss identisch sein.WHERE
Bedingungen wie die Hauptabfrage und gewährleistet so die Datenintegrität.Diese Methode reduziert die Ausführungszeit von Abfragen erheblich, selbst bei großen Tabellen, und bietet eine viel skalierbarere Lösung zum Abrufen mehrerer Zufallsergebnisse.
Fazit
Diese Optimierungstechniken bieten eine erhebliche Leistungssteigerung bei der zufälligen Datenauswahl in MySQL. Durch die Vermeidung von ORDER BY RAND()
können Sie effizientere und robustere Datenbankanwendungen erstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich effizient mehrere Zufallsergebnisse aus einer Datenbank abrufen, ohne „ORDER BY RAND()' zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!