2016-08-28 2 views

답변

1

예. 결과를 제한하기 전에 작업 별 오더가 수행됩니다.

좋은 성능의 임의의 레코드를 얻으려면 다른 접근 방식을 사용해야합니다.

해결책은 다음과 같습니다 만하여 난수를 생성하고 그 기록을 가져올 수 있습니다 순차적 인 ID를 가지고 경우 where 절 : 10000 테이블에서 가장 큰 ID입니다

Select * from t 
where id>(select * from 
    (select rand()*10000)t1 
) limit 1; 

.

우리가 사용할 수있는 쿼리가 더 역동적 만들기 위해

:

SET @m:=rand()*(select max(id) from t); 
SELECT * FROM t WHERE id > @m LIMIT 1; 

또한이 작품 :

Select * from t 
where 
    id>(select * from(select rand()*max(id) from t) t1) 
limit 1; 

그러나 다음 쿼리가 잘못하고 처음 레코드의 약 0.5 퍼센트를 보여줍니다.

Select * from t 
where 
    id>rand()*(select max(id) from t) 
limit 1; 
+0

좋아요, 정말 원하지 않는 많은 요소를 정렬하는 데 많은 시간이 걸릴 수 있습니다. – FrozenHeart

+0

@FrozenHeart 네, 시간이 많이 걸립니다. –

+1

mysql에 많은 시간이 걸린다. – dllhell

2

이 질문은 RAND() 작업을 수행하는 방법에 비해 LIMIT 쿼리 최적화 기능과 더 많은 관계를 가지고있다 : 그리고 난 이유를 모르겠어.

manual (굵게 강조 광산)에서 : 당신이 BY ORDER와 LIMIT ROW_COUNT 을 결합하면

는 MySQL의 종료가 처음 ROW_COUNT 발견되는 즉시 정렬 전체 결과를 정렬하는 것이 아니라 정렬 된 결과의 행을 검색합니다.

색인을 사용하여 주문하는 경우 매우 빠릅니다. filesort가 수행해야하는 경우, LIMIT 절 없이 쿼리와 일치하는 모든 행을 선택, 대부분 또는 전부가 정렬, 첫 ROW_COUNT 이전 를 찾을 수 있습니다. 최초의 행이 발견되면 (자), MySQL는 결과 세트의 나머지를 소트하지 않습니다.

+0

"filesort"는 무엇을 의미합니까? – FrozenHeart

+0

색인에서 정렬을 수행 할 수없는 경우 파일 포트입니다. EXPLAIN 계획을 확인하고 파일 _ 사용 _이 나타나는지 확인하십시오. –

+0

그래서 RAND() (인덱스와 관련이 없기 때문에)를 사용하는 쿼리에 대해 filesort를 수행하고 "대부분 또는 모든 행"을 정렬합니까? – FrozenHeart

관련 문제