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

MySQL:Alternativen zu ORDER BY RAND()

UPDATE 2016

Diese Lösung funktioniert am besten mit einer indizierten Spalte .

Hier ist ein einfaches Beispiel für eine optimierte Abfragebank mit 100.000 Zeilen.

OPTIMIERT:300 ms

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

Hinweis zum Höchstbetrag :Grenze 4 und 4/Anzahl (*). Die 4er müssen die gleiche Zahl sein. Das Ändern der Anzahl, die Sie zurückgeben, wirkt sich nicht so sehr auf die Geschwindigkeit aus. Benchmark bei Limit 4 und Limit 1000 sind gleich. Limit 10.000 dauerte bis zu 600 ms

Hinweis zum Beitritt :Das Randomisieren nur der ID ist schneller als das Randomisieren einer ganzen Zeile. Da die gesamte Zeile in den Speicher kopiert werden muss, wird sie dann randomisiert. Der Join kann jede Tabelle sein, die mit der Unterabfrage Its verknüpft ist, um Tablescans zu verhindern.

beachten Sie die Where-Klausel :Der Where-Count begrenzt die Anzahl der Ergebnisse, die randomisiert werden. Es nimmt einen Prozentsatz der Ergebnisse und sortiert sie statt der gesamten Tabelle.

Unterabfrage beachten :Die if doing joins und extra where Bedingungen müssen Sie sowohl in die Unterabfrage als auch in die Unterabfrage einfügen. Um eine genaue Zählung zu haben und korrekte Daten abzurufen.

NICHT OPTIMIERT:1200 ms

SELECT 
    g.*
FROM
    table g
ORDER BY RAND()
LIMIT 4

VORTEILE

4x schneller als order by rand() . Diese Lösung kann mit jeder Tabelle mit einer indizierten Spalte arbeiten.

NACHTEILE

Es ist ein bisschen komplex mit komplexen Abfragen. Es müssen zwei Codebasen in den Unterabfragen gepflegt werden