2011-01-19 4 views
2

단지 랜드()를 사용하는 것보다 더 빨리 가입 사용하는 방법어떻게 MySQL의

SELECT * FROM `table` ORDER BY RAND() LIMIT 1 

실제로 문제가 먼저 이해하는 데 비해

SELECT t.id 
FROM table t 
JOIN (SELECT(FLOOR(max(id) * rand())) AS maxid FROM table) 
AS tt 
ON t.id >= tt.maxid 
LIMIT 1 

빠릅니다. 어쩌면 내가 왜 다른 사람보다 더 빠른 사람인지 알면 더 나은 이해를 얻을 수있을 것입니다. 기본적으로

* 원래 당신은 쿼리에 EXPLAIN 사용할 수 있습니다 Difficult MySQL self-join please explain

답변

6

@ 포스트 :하지만, 처음 당신이 얻고있는 임의의 숫자에

(매우 느리게하지 않은)에 기초 최대 (i 추정) 색인 필드. 이것은 매우 빠르며, 심지어는 거의 일정한 시간 (인덱스 해시 구현에 따라 다름)을 말하고 싶습니다.

그런 다음 그 숫자에 합류하여 더 큰 첫 번째 행만 반환합니다. 다시 색인을 사용하고 있습니다. 이것은 번개처럼 빠른 것입니다.

두 번째는 임의 함수로 정렬됩니다. 이 작업을 수행해야하지만 설명을보고 FULL TABLE 스캔을 수행 한 다음 첫 번째 결과를 리턴해야합니다. 이것은 매우 비쌉니다. 해당 랜드 때문에 인덱스를 사용하지 않고 있습니다.

(당신이 사용하지 않는 것이 키를 보여주는이 모양을 설명)

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE table ALL NULL NULL NULL NULL 14 Using temporary; Using filesort 
+0

감사합니다! (MySQL 명령의 시간 비용을 요약 한 부분을 알 수 있습니까?) – whamsicore

+0

나는 그 정보가 가능하다고 생각하지 않습니다. "EXPLAIN"명령 및 구문을 확인하십시오. 명령 비용은 시스템이 점검해야하는 정도에 따라 다릅니다. 색인을 얻은 경우에는 빠릅니다. 전체 표 스캔을 수행해야하는 경우 느립니다. 먼저 인덱스, 조인 (인덱스 포함) 및 하위 쿼리/임시 테이블을 읽습니다. 그런 다음 test-db와 EXPLAIN 명령으로 놀아 라. – Nanne