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

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

Barbara Streisand
풀어 주다: 2024-12-13 10:06:18
원래의
302명이 탐색했습니다.

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

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

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