Heim >Datenbank >MySQL-Tutorial >So implementieren Sie Zufallszahlen mit MySQL und function_MySQL

So implementieren Sie Zufallszahlen mit MySQL und function_MySQL

WBOY
WBOYOriginal
2016-10-09 08:33:381170Durchsuche

Ich muss eine MYSQL-Datenbank testen. Wie kann ich eine PHP-Datei schreiben, um Hunderte von Informationen gleichzeitig zu aktualisieren? eine Zeit, also weiß ich, wie man es mit WHILE schreibt. Okay, wenn ein Update etwa 100 Daten umfasst, wie schreibt man es? Die richtige Antwort ist die Verwendung der MySQL-Rand-Funktion: UPDATE cdb_posts SETviews = rand(); (), achten Sie auf die Felder. Ist die Breite ausreichend? Ich dachte immer, dass MySQL einige Daten zufällig abfragt, also verwenden Sie SELECT * FROM `table` ORDER BY RAND() LIMIT 5
Das ist es.

Aber nach einem echten Test habe ich festgestellt, dass dies sehr ineffizient ist. Bei einer Datenbank mit mehr als 150.000 Elementen dauert die Abfrage von 5 Daten mehr als 8 Sekunden. Es heißt auch, dass rand() in der ORDER BY-Klausel mehrmals ausgeführt wird ineffizient. .

Durchsuchen Sie Google. Grundsätzlich können Sie max(id) * rand() im Internet abfragen, um Daten nach dem Zufallsprinzip zu erhalten.

SELECT * 
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 
WHERE t1.id >= t2.id 
ORDER BY t1.id ASC LIMIT 5;

Dies führt jedoch zu 5 aufeinanderfolgenden Datensätzen. Die Lösung kann nur darin bestehen, jeweils eine Abfrage fünfmal abzufragen. Trotzdem lohnt es sich, denn die Abfrage einer Tabelle mit 150.000 Einträgen dauert nur weniger als 0,01 Sekunden. Die obige Anweisung verwendet JOIN, und jemand im MySQL-Forum verwendet es

SELECT * 
FROM `table` 
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) 
ORDER BY id LIMIT 1;

Ich habe es getestet, es dauert 0,5 Sekunden und die Geschwindigkeit ist gut, aber es gibt immer noch eine große Lücke zur obigen Aussage. Ich habe immer das Gefühl, dass etwas nicht normal ist. Also habe ich den Satz umformuliert.

SELECT * FROM `table` 
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 
ORDER BY id LIMIT 1;

Jetzt wurde die Effizienz erneut verbessert, die Abfragezeit beträgt nur noch 0,01 Sekunden. Abschließend werde ich die Anweisung verbessern und die Beurteilung von MIN(id) hinzufügen. Als ich zum ersten Mal getestet habe, wurden die ersten paar Zeilen in der Tabelle immer in der Hälfte der Zeit abgefragt, weil ich das MIN(id)-Urteil nicht hinzugefügt hatte.
Die vollständige Abfrageanweisung lautet:

SELECT * FROM `table` 
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))) 
ORDER BY id LIMIT 1;
SELECT * 
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2 
WHERE t1.id >= t2.id 
ORDER BY t1.id LIMIT 1;

Abschließend fragen Sie diese beiden Anweisungen jeweils zehnmal in PHP ab,
Ersteres dauert 0,147433 Sekunden
Letzteres dauert 0,015130 Sekunden

Das Obige zeigt, wie die MySQL-Rand-Funktion Zufallszahlen implementiert.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn