다음 쿼리는 실제로 어떻게 작동합니까?SQL 쿼리에서 RAND()는 실제로 어떻게 작동합니까?
SELECT * FROM t ORDER BY RAND() LIMIT 1;
먼저 소스 데이터베이스에 일종의 모든 기록을합니까 그냥 다음 1 개 행을 얻기 위해 그것을 잘라?
다음 쿼리는 실제로 어떻게 작동합니까?SQL 쿼리에서 RAND()는 실제로 어떻게 작동합니까?
SELECT * FROM t ORDER BY RAND() LIMIT 1;
먼저 소스 데이터베이스에 일종의 모든 기록을합니까 그냥 다음 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;
좋아요, 정말 원하지 않는 많은 요소를 정렬하는 데 많은 시간이 걸릴 수 있습니다. – FrozenHeart
@FrozenHeart 네, 시간이 많이 걸립니다. –
mysql에 많은 시간이 걸린다. – dllhell
이 질문은 RAND()
작업을 수행하는 방법에 비해 LIMIT
쿼리 최적화 기능과 더 많은 관계를 가지고있다 : 그리고 난 이유를 모르겠어.
manual (굵게 강조 광산)에서 : 당신이 BY ORDER와 LIMIT ROW_COUNT 을 결합하면
는 MySQL의 는 종료가 처음 ROW_COUNT 발견되는 즉시 정렬 전체 결과를 정렬하는 것이 아니라 정렬 된 결과의 행을 검색합니다.
색인을 사용하여 주문하는 경우 매우 빠릅니다. filesort가 수행해야하는 경우, LIMIT 절 없이 쿼리와 일치하는 모든 행가을 선택, 대부분 또는 전부가 정렬, 첫 ROW_COUNT 이전 는를 찾을 수 있습니다. 최초의 행이 발견되면 (자), MySQL는 결과 세트의 나머지를 소트하지 않습니다.
"filesort"는 무엇을 의미합니까? – FrozenHeart
색인에서 정렬을 수행 할 수없는 경우 파일 포트입니다. EXPLAIN 계획을 확인하고 파일 _ 사용 _이 나타나는지 확인하십시오. –
그래서 RAND() (인덱스와 관련이 없기 때문에)를 사용하는 쿼리에 대해 filesort를 수행하고 "대부분 또는 모든 행"을 정렬합니까? – FrozenHeart
예. 나는 그렇게 생각한다. – 1000111