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

Warum gibt MySQL die gleichen Ergebnisse zurück, wenn RAND() in der SELECT-Anweisung verwendet wird?

Rand()-Startwert

MySQL verwendet die Systemuhr zum Seeding von RAND() wenn es keinen zweiten Wert gibt. Der Startwert ist in Mikrosekunden, und ich kann das Problem von RAND() nicht reproduzieren zweimal denselben Wert erzeugen, wie Sie ihn beschreiben.

Wenn Sie MySQL Workbench öffnen und zwei Anweisungen gleichzeitig ausführen. Die Ausgabe ist jeweils unterschiedlich.

SELECT RAND();
SELECT RAND();

Wenn Sie mehrere Registerkarten öffnen und dieselben Ergebnisse erhalten. Es handelt sich wahrscheinlich um ein Caching-Problem, aber Sie geben an, dass Sie die URL stempeln, um das Caching zu verhindern. Aktivieren Sie also die SQL-Protokollierung auf dem Server und prüfen Sie, ob neue Abfragen aufgerufen werden.

Rand()-Leistung

ORDER BY RAND() ist langsam, da MySQL die gesamte Tabelle lesen muss. Sogar ORDER BY RAND() LIMIT 1 erfordert immer noch, dass MySQL die gesamte Tabelle liest.

AKTUALISIERUNG:

Sie können sehen, was der Zufallswert ist, den SQL generiert.

$query = "SELECT *, RAND() AS `X`
          FROM customers
          WHERE customer_group='consumables' AND customer_updated < DATE_SUB(NOW(), INTERVAL 1 DAY)
          ORDER BY `X`
          LIMIT 10";

Dazu gehört die Spalte X Für jede Reihe. Der Zufallswert, der zum Sortieren der Abfrage verwendet wird. Fügen Sie dies der Ausgabe hinzu und sehen Sie, ob jeder Browser wirklich ist Rückgabe der gleichen Ergebnismengen von MySQL.