MySQL의 ORDER BY RAND() 함수 최적화
소개
MySQL의 ORDER BY RAND() 함수는 특히 쿼리 성능이 저하될 수 있습니다. 최적화된 테이블. 이 문서에서는 이러한 쿼리를 최적화하기 위한 효율적인 기술을 살펴보고 이 문제를 해결하기 위한 실용적인 솔루션을 제공합니다.
최적화 기술
효과적인 솔루션 중 하나는 다음과 결합된 하위 쿼리를 사용하는 것입니다. 아래에 설명된 STRAIGHT_JOIN:
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
이 방법은 특히 효율적인 것으로 입증되었습니다. COUNT(*) 작업의 순간적인 특성으로 인해 MyISAM 테이블. InnoDB 테이블의 경우 ORDER BY RAND()보다 훨씬 빠릅니다.
단일 무작위 레코드만 필요한 경우 다른 접근 방식을 사용할 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!