2011-01-17 12 views
4

Also in MySQL, ich habe gelesen, dass für große Tabellen mit vielen Zeilen, ORDER BY RAND() ist eine schlechte Idee (auch mit ~ 500 Row-Tabellen, angeblich). Langsam und ineffizient. Viele Zeilen scannen.Gute Idee/schlechte Idee? Verwenden von MySQL RAND() außerhalb eines kleinen Satzes von Unterabfrageergebnissen?

Wie scheint dies (unten) für eine Alternative?

SELECT * FROM (... Unterabfrage, die im Allgemeinen einen Satz von weniger als 20 Zeilen zurückgibt ...) ORDER BY RAND() LIMIT 8

Anstelle der Verwendung von RAND() auf einer großen Menge von Daten, Ich würde eine kleine Teilmenge auswählen, und nur dann würde ich RAND() auf diese zurückgegebenen Zeilen anwenden. In 99,9% aller Fälle sollte die oben genannte Unterabfrage weniger als 20 Zeilen auswählen (und in der Regel sind es weniger als 8 Zeilen).

Neugierig zu hören, was die Leute denken.

(nur als Referenz, ich mache meine MySQL Sachen mit PHP.)

Dank!

+0

Klingt nicht wie es ein Problem sein würde. Aber wie immer, Your Mileage May Vary (tm). Führen Sie ein Benchmarking dieser Subselect-Methode und ein Benchmarking der Auswahl aus der vollständigen Tabelle durch und sehen Sie, wo Sie hinkommen. –

+0

** Nicht wirklich ** Query-Cache hat keine Auswirkungen auf rand() (Bypass-Query-Cache), so dass der Engpass jetzt auf die Unterabfrage verschoben – ajreal

+0

Wenn die Unterabfrage "in der Regel weniger als 8" zurückgibt, warum genau tun Sie benötigen die 'ORDER BY RAND() LIMIT 8'? –

Antwort

8

Eigentlich ... endete ich einen Test und ich könnte meine eigene Frage beantwortet haben. Ich dachte, ich würde diese Informationen hier posten, für den Fall, dass es für andere nützlich ist. (Wenn ich etwas falsch hier getan haben, lassen Sie es mich wissen!)

Diese Art von überraschend ...

Im Gegensatz zu allem, was ich gelesen habe, habe ich eine Tabelle namens Testdata mit 1 Million Zeilen und liefen die folgende Abfrage:

SELECT * FROM Testdata WHERE-Zahl = 41 ORDER BY RAND() LIMIT 8

... und die Zeilen in einem Durchschnitt von 0,0070 Sekunden zurück. Ich sehe nicht wirklich, warum RAND() einen so schlechten Ruf hat. Es scheint mir ziemlich brauchbar zu sein, zumindest in dieser besonderen Situation.

Ich habe drei Spalten in meiner Tabelle:

id [BIGINT (20)] | textfield [kleiner Text] | Nummer [BIGINT (20)]

Primärschlüssel auf ID, Index auf Nummer.

Ich denke, MySQL ist schlau genug zu wissen, dass es RAND() nur auf die 20 Zeilen anwenden soll, die von "WHERE number = 41" zurückgegeben werden? (Ich fügte spezifisch nur 20 Zeilen hinzu, die den Wert 41 für 'Nummer' hatten.)

Die alternative Unterabfrage-Methode gibt Ergebnisse mit einer durchschnittlichen Zeit von ungefähr .0080 Sekunden zurück, die langsamer als die Nicht-Unterabfrage-Methode ist.

Subquery Methode: SELECT * FROM (SELECT * FROM WHERE Testdata-Zahl = 41) als t ORDER BY RAND() LIMIT 8

+0

+1 und ein goldener Sternstempel für die Durchführung eines Leistungsprototyps und die Erkenntnis, dass keine Optimierung erforderlich ist. – Oddthinking

+0

Vielen Dank, Oddthinking! :) – hithere

0

Klingt wie Sie auf dem richtigen Weg. Eine der besten Möglichkeiten, um bei der Verwendung von MySQL effizienter zu arbeiten, besteht darin, Ihre Datensätze durch meisterhafte Abfragen einzuschränken.

Verwandte Themen