> 데이터 베이스 > MySQL 튜토리얼 > 더 나은 성능을 위해 MySQL의 ORDER BY RAND()를 어떻게 최적화할 수 있습니까?

더 나은 성능을 위해 MySQL의 ORDER BY RAND()를 어떻게 최적화할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-15 22:28:11
원래의
393명이 탐색했습니다.

How Can I Optimize MySQL's ORDER BY RAND() for Better Performance?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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