Heim > Datenbank > MySQL-Tutorial > Wie kann ich effizient mehrere Zufallsergebnisse aus einer Datenbank abrufen, ohne „ORDER BY RAND()' zu verwenden?

Wie kann ich effizient mehrere Zufallsergebnisse aus einer Datenbank abrufen, ohne „ORDER BY RAND()' zu verwenden?

Mary-Kate Olsen
Freigeben: 2025-01-21 03:36:08
Original
271 Leute haben es durchsucht

How Can I Efficiently Retrieve Multiple Random Results from a Database without Using `ORDER BY RAND()`?

Vermeidung von Leistungsengpässen durch zufälligen Datenabruf in MySQL

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

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

Erläuterung der Optimierungen

Diese überarbeitete Abfrage enthält mehrere wichtige Verbesserungen:

  • Indizierte Spaltennutzung: Die Unterabfrage filtert Zeilen mithilfe von RAND() gegen einen Prozentsatz der Gesamtzeilen. Die Indizierung der Spalte id (oder der in der Klausel WHERE verwendeten Spalte) ermöglicht eine schnelle Zeilenidentifizierung.
  • Nur ​​randomisierte IDs: Die Randomisierung wird nur auf IDs angewendet, wodurch die Speichernutzung minimiert und die Leistung verbessert wird.
  • Konsistente Grenze: Die LIMIT-Klausel sowohl in der Unterabfrage (4) als auch in der Gesamtabfrage muss identisch sein.
  • Verfeinerte Unterabfrage: Die Unterabfrage enthält die gleichen 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!

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