Zufällige Rückgabe eines Datenelements aus einer Abfrage. Im Allgemeinen wird die Methode order by rand() von MySQL verwendet, um
Zum Beispiel: Zufällig aus 200.000 zu erreichen Benutzer 1 Benutzer extrahieren
mysql> select * from user order by rand() limit 1; +-------+------------+----------------------------------+----------+--------------+-----------+| id | phone | password | salt | country_code | ip | +-------+------------+----------------------------------+----------+--------------+-----------+| 15160 | 6549721306 | e4f302120c006880a247b652ad0e42f2 | 40343586 | 86 | 127.0.0.1 | +-------+------------+----------------------------------+----------+--------------+-----------+1 row in set (0.25 sec)mysql> explain select * from user order by rand() limit 1; +----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+| 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 200303 | Using temporary; Using filesort | +----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+1 row in set (0.00 sec)
Laut den Analyseergebnissen dauert der Vorgang 0,25 Sekunden, die Bestellung nach rand() muss die temporäre Tabelle verwenden (Verwendung von temporär) und muss die Dateisortierung (Verwenden von Dateisortierung) verwenden, was ineffizient ist.
Ermitteln Sie zunächst die Gesamtzahl der abgefragten Datensätze
2. Versetzen Sie N Datensätze zufällig in die Gesamtzahl der Datensätze (N=0~Gesamt-1). 🎜>3. Verwenden Sie Limit N,1, um Datensätze zu erhalten
Der Code lautet wie folgt:
<?php// 获取总记录数$sqlstr = 'select count(*) as recount from user';$query = mysql_query($sqlstr) or die(mysql_error());$stat = mysql_fetch_assoc($query);$total = $stat['recount'];// 随机偏移$offset = mt_rand(0, $total-1);// 偏移后查询$sqlstr = 'select * from user limit '.$offset.',1';$query = mysql_query($sqlstr) or die(mysql_error());$result = mysql_fetch_assoc($query); print_r($result);?>
Analyse:
mysql> select * from user limit 23541,1; +-------+------------+----------------------------------+----------+--------------+-----------+| id | phone | password | salt | country_code | ip | +-------+------------+----------------------------------+----------+--------------+-----------+| 23542 | 3740507464 | c8bc1890de179538d8a49cc211859a46 | 93863419 | 86 | 127.0.0.1 | +-------+------------+----------------------------------+----------+--------------+-----------+1 row in set (0.01 sec)mysql> explain select * from user limit 23541,1; +----+-------------+-------+------+---------------+------+---------+------+--------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+--------+-------+| 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 200303 | NULL | +----+-------------+-------+------+---------------+------+---------+------+--------+-------+1 row in set (0.00 sec)
Interpretation von Inhalten im Zusammenhang mit der PHP-PDO-Verbindungsdatenbank
Erklärung der objektorientierten PHP-Vererbung verwandter Code
Verwenden Sie die magische Methode __CLASS__ in PHP, um verwandte Operationen des Klassennamens abzurufen
Das obige ist der detaillierte Inhalt vonEffizienzoptimierungsmethode für MySQL Order by Rand(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!