> 데이터 베이스 > MySQL 튜토리얼 > rand() 효율성 최적화 방법을 통한 mysql 주문

rand() 효율성 최적화 방법을 통한 mysql 주문

jacklove
풀어 주다: 2018-06-08 23:36:50
원래의
2237명이 탐색했습니다.

일반적으로 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 = &#39;select count(*) as recount from user&#39;;$query = mysql_query($sqlstr) or die(mysql_error());$stat = mysql_fetch_assoc($query);$total = $stat[&#39;recount&#39;];// 随机偏移$offset = mt_rand(0, $total-1);// 偏移后查询$sqlstr = &#39;select * from user limit &#39;.$offset.&#39;,1&#39;;$query = mysql_query($sqlstr) or die(mysql_error());$result = mysql_fetch_assoc($query);
print_r($result);?>
로그인 후 복사
이 글에서는 rand() 효율성 최적화 방법에 의한 mysql 순서를 소개합니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 참고해주세요.

관련 권장 사항:

PHP의 데이터베이스에 대한 PDO 연결 해석

PHP 객체 지향, PHP 상속 관련 코드 설명

클래스 이름을 가져오려면 PHP에서 매직 메소드 __CLASS__를 사용하세요. 관련 운영

위 내용은 rand() 효율성 최적화 방법을 통한 mysql 주문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿