집 >데이터 베이스 >MySQL 튜토리얼 >더 나은 성능을 위해 MySQL의 ORDER BY RAND()를 어떻게 최적화할 수 있습니까?
MySQL의 ORDER BY RAND() 성능 최적화
MySQL 쿼리를 최적화할 때 ORDER BY RAND() 함수가 포함된 느린 쿼리를 처리하는 방법은 다음과 같습니다. 도전적이다. 이 기사에서는 이러한 쿼리의 성능을 향상시키는 효과적인 솔루션을 살펴봅니다.
일반적인 접근 방식은 임의의 값을 기반으로 각 행의 순위를 계산하는 하위 쿼리를 사용하는 것입니다. 이를 통해 실제 정렬 없이 임의의 행을 효율적으로 선택할 수 있습니다.
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 값이 상대적으로 균일하게 분포되어 있다고 가정합니다. 이러한 기술을 활용하면 ORDER BY RAND()와 관련된 MySQL 쿼리를 크게 최적화할 수 있습니다.
위 내용은 더 나은 성능을 위해 MySQL의 ORDER BY RAND()를 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!