2011-01-17 2 views
4

그래서 MySQL에서는 ORDER BY RAND()를 사용하여 많은 행이있는 대형 테이블을 읽는 것이 좋지 않습니다 (~ 500 행 테이블이 있다고 가정). 느리고 비효율적입니다. 많은 행 검색.좋은 아이디어/나쁜 아이디어? 하위 쿼리 결과 집합 외부에서 MySQL RAND() 사용?

어떻게 (아래) 대체 방법으로 보입니까?

SELECT * FROM (... 일반적으로 20 개 미만 ... 행 세트 리턴 부질) ORDER BY RAND()를 LIMIT 8 큰 데이터 세트 대신 RAND를 사용

() 작은 하위 집합을 선택하고 난 다음에는 반환 된 행에 RAND()를 적용합니다. 모든 경우의 99.9 %에서 위의 하위 쿼리는 20 개 미만의 행을 선택해야합니다 (실제로는 일반적으로 8 개 미만).

사람들이 생각하는 것을 듣는 것이 궁금합니다.

는 (그냥 참조를 위해, 나는 PHP 내 MySQL의 물건을하고 있어요.)

감사합니다!

+0

RAND BY t 순서와() LIMIT 8 (* TestData 사용 FROM 수 = 41을 선택). 그러나 언제나처럼, Your Mileage May Vary (tm). 이 subselect 방법의 일부 벤치마킹을 수행하고 전체 테이블에서 선택하는 벤치마킹을 수행하고 어디로 가는지 확인하십시오. –

+0

** 실제로는 쿼리 캐시가 rand() (바이 패스 쿼리 캐시)에 영향을 미치지 않으므로 병목 현상이 이제 하위 쿼리 – ajreal

+0

으로 옮겨졌습니다. 하위 쿼리가 "일반적으로 8보다 작습니다"를 반환하면 정확히 수행해야하는 이유 'RAND() LIMIT 8 '명령이 필요합니까? –

답변

8

사실 ... 나는 시험을 치는 것을 끝내었고 나는 내 자신의 질문에 대답했을 것입니다. 다른 사람들에게 유용 할 경우를 대비하여이 정보를 여기에 올릴 것이라고 생각했습니다. (내가 여기 아무 잘못을 한 적이 있으면 알려 주시기 바랍니다!)

이 가지 놀라운 ... 내가 읽은 모든 것을 반대로

, 나는 1 백만 TestData 사용라는 테이블을 생성 행과 다음 쿼리 실행 : TestData 사용 FROM

SELECT * RAND을 WHERE BY 수 = 41 ORDER() LIMIT 8

...하고 0.0070 초 평균의 행을 반환. 나는 RAND()가 그렇게 나쁜 평판을 갖는 이유를 정말로 보지 못한다. 적어도이 특별한 상황에서는 나에게 꽤 유용하게 보입니다. | [BIGINT (20)]

ID :

나는 나의 테이블에 세 개의 열이 텍스트 필드 [tinytext] | 번호 [BIGINT (20)]

기본 키, 숫자에 대한 인덱스.

MySQL은 "WHERE number = 41"에 의해 반환되는 20 개의 행에만 RAND()를 적용해야한다는 것을 알기에 충분히 똑똑하다고 생각하십니까? (특히 'number'에 대해 값이 41 인 행을 20 개만 추가했습니다.)

대체 하위 쿼리 메서드는 평균이 약 0.0080 초인 결과를 반환하며 비 서브 쿼리 메서드보다 느립니다.

부질있어서 FROM SELECT *가 문제 될 것 같은 소리 않는다

+0

+1 및 성능 프로토 타입을 수행하고 최적화 할 필요가 없다는 것을 인식하기위한 황금 별 스탬프. – Oddthinking

+0

고마워, Oddthinking! :) – hithere

0

올바른 트랙에서 나처럼 소리가납니다. MySQL의 사용을보다 효율적으로하는 가장 좋은 방법 중 하나는 마스터 쿼리를 통해 데이터 세트를 제한하는 것입니다.