우리의 개발 효율성의 문제가 되었습니다, 그리고 특히 대용량 데이터 작업을 많이에 대 한 오늘 우리 다 퉜 다는 임의의 쿼리 데이터, 처음에 우리가 생각할 수 있습니다 간단한 순서 RAND () 작동 하지만 효율성 아니에요 아첨 아.
최근, MySQL 랜덤 추출 구현 방법 연구 필요 때문에. 예를 들어 임의로 TableName 테이블에서 레코드를 추출, 일반 문구 것: 선택 * 랜드 () 제한 1 TableName 순서에서.
이러한 결과 달성 하는 방법은 두 가지가 있습니다.
1. 5에서 5 사이의 숫자의 수를 새 테이블을 만듭니다. 순서 rand () 사용 하 여 임의의 숫자를 얻을.
#建立指定范围数据表
코드는 다음과 같습니다.
#auther: 샤 오 창족 (점쟁이)
#date: 2008-03-31
만들 테이블 Randnumber
숫자로 선택-1
연합
선택 2
연합
선택 3
연합
선택 4
연합
선택-5
연합
0 선택
연합
선택 1
연합
선택 2
연합
선택 3
연합
4 선택
연합
5 선택
#得到随机数
#auther: 샤 오 창족 (점쟁이)
#date: 2008-03-31
번호 선택
Randnumber 랜드 ()에서 제한 1
장점: 난수 데이터의 일부를 지정할 수 있습니다, 그리고 지속적인 필요 하지 않습니다.
단점: 임의의 숫자의 범위는 매우 광범위 한 때 그것 더 어렵습니다 테이블을 만들려고.
2.를 사용 하 여 MySQL의 라운드 () + rand () 함수 구현
#一句sql语句搞定
#auther: 샤 오 창족 (점쟁이)
#date: 2008-03-31
코드는 다음과 같습니다.
라운드 선택 ((0.5-랜드 ()) * 2 * 5)
#注释
#0.5-rand () 0.5 사이 얻을 수 있습니다 임의의 숫자
# (0.5-랜드 ()) * 2 + 1 난수 1을 얻을 수 있다
# (0.5-랜드 ()) * 2 * 5 5 + 5를 난수를 얻을 수 있습니다
#ROUND ((0.5-랜드 ()) * 2 * 5) 5 + 5 임의의 정수를 얻을 수 있다
하지만 그때 난 공식 MySQL 매뉴얼 고 rand ()에 대 한 힌트는 아마는 rand () 함수 사용할 수 없습니다 ORDER BY 절에 데이터 열을 여러 번 스캔을 발생할 것이 있기 때문에 의미. 그러나, MySQL 3.23 버전에서 그것은 여전히 RAND ()는 순서에 의해 임의의 구현 가능입니다.
하지만 실제 테스트는 매우 효율적으로 발견 됐다. 엄청나게 8 초 이상 150000 이상의 도서관 5 데이터를 쿼리 합니다. 또한 랜드 ()는 ORDER BY 절에 자연스럽 게 비효율적 이며 매우 낮은 여러 번 실행 했다 공식 매뉴얼 보기
구글 검색, 인터넷 최대 (ID) 쿼리 기본적으로 * 랜드 () 무작위로 데이터를 가져옵니다.
코드는 다음과 같습니다.
선택 * '테이블' T1 가입으로 (라운드 선택 (RAND () * (선택 최대 (ID) '테이블'에서) ID로) T2 어디 t1.id로 > = t2.i T1.id ASC 제한 5; D 주문
하지만이 연속 5 레코드를 생성 합니다. 한 번에 하나의 쿼리 수, 쿼리 5 번 솔루션 수 있습니다. 그럼에도 불구 하 고, 150000 테이블 인해 쿼리 0.01 초만 필요합니다.
다음 문은 어디에 누군가가 사용 하는 mysql 포럼 조인에 사용 되며
코드는 다음과 같습니다.
선택 * '테이블' 어디 ID > = (바닥을 선택 (최대 (ID) * '테이블', ORDER ID 제한 1; by 랜드 ())
내가 그것을 테스트, 걸리는 0.5 초, 그리고 속도 좋은, 하지만 여전히 위의 문으로 큰 간격이 있다. 항상 뭔가 잘못 하 고 있다.
그래서 내가 다시 문을 썼다.
코드는 다음과 같습니다.
선택 * '테이블'에서
어디 ID > = (선택 층 (RAND () * ('테이블'에서 최대 (ID)를 선택))
주문 ID 제한 1.
이, 효율성 증가, 쿼리 시간은 0.01 초만
마지막으로, 개선, 분 (id) 판단 플러스 문. 테스트의 시작 부분에 분 (id) 판단, 추가 하지 않았다 때문에 결과 항상 시간의 절반 첫 번째 쿼리는 테이블에 몇 줄.
전체 쿼리 문이입니다.
코드는 다음과 같습니다.
선택 * '테이블'에서
어디 ID > = (선택 층 '테이블' (ID)) + (선택 분 (ID) () () + (()) (() () + (() () () () + ("()") M ' 테이블 '))
주문 ID 제한 1.
선택 *
'테이블' T1 가입으로 (라운드 (선택 최대 (ID) '테이블'에서) 선택 (선택 '테이블'에서 분 (Id))) + (선택 분) d)에서 '표')으로 ID) t 2로
어디 t1.id > = t2.id
주문 t1.id 제한 1.
마지막으로 PHP에서 두 개의 문은 쿼리 됩니다 별도로 10 배,
0.147433 초 전 걸립니다.
후자의 소요 시간 0.015130 초
조인에 대 한 구문은 where에서 직접 함수 사용의 효율성 보다 훨씬 높은 것 같다.
우리는 조인 구문을 사용 하 여에서 직접 사용 보다 훨씬 더 빨리 결론에 온 많은 테스트 후 친구 채팅 나올 수 제출 하는 더 나은 있다.