MySQL에서 `ORDER BY RAND()`가 예측할 수 없는 성능을 보이는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-04 03:58:30
원래의
498명이 탐색했습니다.

Why Does `ORDER BY RAND()` Have Such Unpredictable Performance in MySQL?

MySQL의 ORDER BY RAND() 및 놀라운 성능 탐구

소개
ORDER BY RAND( )은 테이블에서 임의의 행을 검색하기 위해 MySQL에서 일반적으로 사용되는 구성입니다. 그러나 이렇게 간단해 보이는 구문 뒤에는 예상치 못한 성능 변화를 초래할 수 있는 복잡한 메커니즘이 숨어 있습니다. 이 기사에서는 ORDER BY RAND()의 내부 작동 방식을 자세히 알아보고 몇 가지 불가사의한 동작을 설명하려고 합니다.

ORDER BY RAND()의 예기치 않은 결과
직관에 반하는 성능 차이가 발생합니다. 데이터 유형이 다른 열에 ORDER BY RAND()를 사용할 때. 다음 쿼리는 이 현상을 보여줍니다.

  • SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40초*/
  • SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25초*/
  • SELECT ID, 사용자 이름 FROM 테이블 ORDER BY RAND() LIMIT 1; /*90초*/

세 쿼리 모두에서 단일 열을 정렬하더라도 실행 시간은 크게 다릅니다. 이는 기본 메커니즘과 데이터 특성에 대한 의존성에 대한 의문을 제기합니다.

Jay의 솔루션: 빠른 무작위 선택
성능 문제를 해결하기 위해 Jay는 다음과 같은 대체 방법을 제안했습니다.

<code class="sql">SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;</code>
로그인 후 복사

이 쿼리는 기존 ORDER BY RAND() 접근 방식보다 성능이 훨씬 뛰어나며, 무작위 데이터를 선택하는 보다 효율적인 방법을 강조합니다. 이 방법은 성능 문제를 해결하지만 복잡성을 야기하며 모든 시나리오에서 항상 실행 가능한 것은 아닙니다.

성능 변화 이해
ORDER BY RAND( ) 쿼리는 MySQL의 인덱싱 기능으로 설명할 수 있습니다. 이 경우 id와 같은 인덱스 열을 사용하면 데이터에 더 빠르게 액세스할 수 있어 더 빠른 실행이 가능합니다. SELECT id, username FROM table ORDER BY RAND() LIMIT 1;과 같이 여러 열을 검색하는 경우 MySQL은 두 열의 값을 모두 검색해야 하므로 실행 시간이 늘어납니다.

결론
ORDER BY RAND()는 무작위 행을 검색하는 데 여전히 유용한 도구이지만 성능에 미치는 영향을 이해하는 것이 중요합니다. 관련된 데이터 유형을 고려하고 필요한 경우 대체 방법을 활용함으로써 개발자는 쿼리를 최적화하고 더 빠른 결과를 얻을 수 있습니다.

위 내용은 MySQL에서 `ORDER BY RAND()`가 예측할 수 없는 성능을 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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