> 데이터 베이스 > MySQL 튜토리얼 > 더 빠른 무작위 행 선택을 위해 MySQL의 ORDER BY RAND() 함수를 어떻게 최적화할 수 있습니까?

더 빠른 무작위 행 선택을 위해 MySQL의 ORDER BY RAND() 함수를 어떻게 최적화할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-12-19 22:40:15
원래의
582명이 탐색했습니다.

How Can I Optimize MySQL's ORDER BY RAND() Function for Faster Random Row Selection?

더 빠른 무작위 행 선택을 위해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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