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

Zufällige Ergebnisse zurückgeben (order by rand())

Der Grund für die Bestellung nach RAND() langsam sein kann, ist, dass Sie die Datenbank zwingen, die gesamte Tabelle tatsächlich zu sortieren, bevor etwas zurückgegeben wird. Nur die Last auf einen einzelnen Tabellenscan zu reduzieren, ist viel schneller (wenn auch immer noch etwas langsam).

Das bedeutet, dass Sie einen Teil des Weges erreichen könnten, indem Sie einfach die Reihenfolge vermeiden:

  SELECT *
    FROM my_table
   WHERE RAND() < 0.1
ORDER BY RAND()
   LIMIT 100

Dadurch werden ungefähr 1 % aller Zeilen in der Tabelle ausgewählt, sortiert und die obersten 100 zurückgegeben. Beachten Sie jedoch, dass das Hauptproblem hier (sowie bei der Antwort von @cmd) darin besteht, dass Sie nicht sicher sein können, dass die Abfrage zurückgegeben wird überhaupt nichts.

Der obige Ansatz sollte einen Scan der gesamten Tabelle beinhalten (um zu entscheiden, welche Zeilen verwendet werden sollen), gefolgt von einer Art von ungefähr 1% der Zeilen. Wenn Sie viele Zeilen haben, können Sie den Prozentsatz entsprechend reduzieren.