일반적으로 MySQL의 order by rand() 메서드를 사용하여 쿼리에서 데이터 조각을 무작위로 반환합니다. 작업에는
0.25초가 필요하고 rand()로 주문하려면 임시 테이블을 사용해야 하고 (임시 사용) 파일 정렬
(filesort 사용)을 사용해야 하는데 이는 비효율적입니다. 개선 방법1. 먼저 총 쿼리된 레코드 수를 가져옵니다. 2. 총 레코드 수에서 N개의 레코드를 무작위로 오프셋합니다(N=0~total-1). 3.
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)
<?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);?>
관련 권장 사항:
PHP의 데이터베이스에 대한 PDO 연결 해석클래스 이름을 가져오려면 PHP에서 매직 메소드 __CLASS__를 사용하세요. 관련 운영
위 내용은 rand() 효율성 최적화 방법을 통한 mysql 주문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!