>데이터 베이스 >MySQL 튜토리얼 >대규모 데이터 세트에 대한 MySQL의 ORDER BY RAND() 성능을 향상시키는 방법은 무엇입니까?

대규모 데이터 세트에 대한 MySQL의 ORDER BY RAND() 성능을 향상시키는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-18 08:11:14349검색

How to Improve MySQL's ORDER BY RAND() Performance for Large Datasets?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.