더 빠른 무작위 행 선택을 위해 MySQL의 ORDER BY RAND() 함수 최적화
MySQL의 ORDER BY RAND() 함수는 무작위 행 선택에 널리 사용됩니다. 테이블의 행. 그러나 특히 대규모 테이블이나 빈번한 업데이트의 경우 비효율적일 수 있습니다. 이러한 비효율성은 ORDER BY RAND()를 포함하는 쿼리가 속도 저하에 크게 영향을 미치는 느린 쿼리 로그에서 명백히 나타납니다.
한 가지 잠재적인 해결책은 쿼리를 여러 하위 쿼리로 분할하는 MySQLPerformanceBlog의 방법입니다. 그러나 이 기술은 모든 상황에 적합하지 않을 수 있습니다.
대체 접근 방식
향상된 효율성을 제공하는 대체 접근 방식은 다음과 같습니다.
SELECT * FROM ( SELECT @cnt := COUNT(*) + 1, @lim := 10 FROM t_random ) vars STRAIGHT_JOIN ( SELECT r.*, @lim := @lim - 1 FROM t_random r WHERE (@cnt := @cnt - 1) AND RAND(20090301) < @lim / @cnt ) i
이 방법은 두 변수를 기반으로 선택되는 각 행의 실행 확률을 계산하는 방식으로 작동합니다. STRAIGHT_JOIN을 사용하면 결과의 행 순서가 유지되어 효과적으로 무작위 선택을 제공합니다.
특정 사례: 단일 무작위 레코드 선택
요구 사항이 다음과 같은 경우 단일 무작위 기록을 선택하려면 다음 쿼리를 사용할 수 있습니다.
SELECT aco.* FROM ( SELECT minid + FLOOR((maxid - minid) * RAND()) AS randid FROM ( SELECT MAX(ac_id) AS maxid, MIN(ac_id) AS minid FROM accomodation ) q ) q2 JOIN accomodation aco ON aco.ac_id = COALESCE ( ( SELECT accomodation.ac_id FROM accomodation WHERE ac_id > randid AND ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ), ( SELECT accomodation.ac_id FROM accomodation WHERE ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ) )
이 쿼리는 균등한 분포를 가정합니다. ac_id 값.
이러한 대체 접근 방식을 사용하면 ORDER BY RAND() 함수와 관련된 MySQL 쿼리의 성능을 크게 향상시킬 수 있습니다.
위 내용은 더 빠른 무작위 행 선택을 위해 MySQL의 ORDER BY RAND() 함수를 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!