MySQL의 ORDER BY RAND() 성능을 향상하는 방법
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
이 기술은 MyISAM 데이터베이스에서 매우 효율적이며 InnoDB에서도 상당한 성능 향상을 제공합니다.
단일 무작위 레코드 선택
단일 무작위 레코드 선택과 관련된 시나리오의 경우 다음을 고려하세요. 쿼리:
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 값이 균일하게 분포되어 있다고 가정합니다.
위 내용은 대규모 데이터 세트에 대한 MySQL의 ORDER BY RAND() 성능을 향상시키는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!