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