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

Wie kann ich effizient mehrere Zufallszeilen aus MySQL abrufen, ohne ORDER BY RAND() zu verwenden?

Susan Sarandon
Susan SarandonOriginal
2025-01-21 03:21:10680Durchsuche

How Can I Efficiently Retrieve Multiple Random Rows from MySQL without Using ORDER BY RAND()?

MySQL: Zufallsstichprobe mit hohem Durchsatz über ORDER BY RAND() hinaus

Entdecken Sie Alternativen, um mehrere Zufallsergebnisse zu erhalten

Obwohl die ORDER BY RAND()-Funktion von MySQL eine Methode zum direkten Erhalten zufälliger Ergebnisse bereitstellt, ist sie nicht in der Lage, mehrere Zeilen zufälliger Daten effizient auszuwählen. In diesem Artikel werden alternative Techniken zur Optimierung solcher Abfragen untersucht.

Optimierungslösung: Verwendung von Indexspalten und Unterabfragen

Bei Abfragen, die nach zufälligen Ergebnissen suchen, ist die Optimierung der Leistung von entscheidender Bedeutung. Ein innovativer Ansatz, der gut funktioniert, ist die Verwendung einer Kombination aus indizierten Spalten und Unterabfragen. Diese Technik reduziert den Verarbeitungsaufwand erheblich, indem der Randomisierungsprozess auf bestimmte Bedingungen beschränkt wird.

Schritte:

  1. Bestimmen Sie den Prozentsatz der Ergebnisse, die randomisiert werden sollen: Definieren Sie die Anzahl der Ergebnisse, die randomisiert werden sollen, als Prozentsatz der Gesamtzahl der Zeilen.
  2. Erstellen Sie eine Unterabfrage: Verwenden Sie die RAND()-Funktion und die LIMIT-Klausel, um Zeilen-IDs auszuwählen, die einen bestimmten Prozentsatz erfüllen.
  3. Unterabfrage verbinden: Verwenden Sie einen Join, um die Unterabfrage mit der Haupttabelle zusammenzuführen, wobei Sie die Indexspalte als Join-Schlüssel verwenden.
  4. Vollständige Ergebnisse abrufen: Rufen Sie die erforderlichen Spalten aus der Haupttabelle mithilfe der von der Unterabfrage identifizierten Zeilen ab.

Beispiel:

Bedenken Sie die folgende Abfrage:

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

Optimierte Abfrage:

<code class="language-sql">SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id</code>

Vorteile:

  • Optimierung der Ausführungsgeschwindigkeit, viel schneller als ORDER BY RAND()
  • Verbesserung der Skalierbarkeit für große Datenmengen
  • Gilt für jede Tabelle mit indizierten Spalten

Hinweis:

Diese Optimierungsmethode basiert auf der Konsistenz zwischen der Unterabfrage und der Hauptabfrage, um sicherzustellen, dass sie genaue Ergebnisse liefern. Darüber hinaus kann die Wahl angemessener Grenzwerte für den Prozentsatz der randomisierten Ergebnisse dazu beitragen, die Leistung aufrechtzuerhalten.

Das obige ist der detaillierte Inhalt vonWie kann ich effizient mehrere Zufallszeilen aus MySQL abrufen, ohne ORDER BY RAND() zu verwenden?. 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