TIP게시판

제목 INDEX를 이용한 랜덤 정렬
글쓴이 니삼 작성시각 2012/11/29 11:04:20
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 13884   RSS
Real MySQL 위키북스 저자 이성욱
책에서 쿼리 발췌합니다.
 
CREATE TABLE tb_member (
member_id INT NOT NULL AUTO_INCREMENT,
rand_val INT NOT NULL,
PRIMARY KEY (member_id),
INDEX ix_randval(rand_val)
);
INSERT INTO tb_member (member_id, rand_val)
VALUES
 (NULL, FLOOR((RAND() * 10000000))),
 (NULL, FLOOR((RAND() * 10000000))),
 (NULL, FLOOR((RAND() * 10000000))),
 (NULL, FLOOR((RAND() * 10000000))),
 (NULL, FLOOR((RAND() * 10000000))),
 (NULL, FLOOR((RAND() * 10000000)));
많이많이 넣습니다.
원본 방식:
SELECT * from tb_member ORDER BY RAND() LIMIT 1;

explain row : 29849
속도 0.02 

 
SELECT * from tb_member where rand_val>=FLOOR((RAND()*10000000))
ORDER BY rand_val ASC LIMIT 3;

explain rows : 3
0.00 sec 

이론적인 부분이나 원리부분은 적지 않겠습니다. (책을 직접구입하세요 ㅠ_ㅠ)
 다음글 print_r 의 변형 함수 (1)
 이전글 특정 컨트롤러에서 php session 사용하기 (2)

댓글

니삼 / 2012/11/29 11:11:33 / 추천 0
 적용은 랜덤블로그나 랜덤으로 뿌려줘야할 데이터가 있을때 사용하시면 됩니다.
한대승(불의회상) / 2012/11/29 11:12:02 / 추천 0
좋은 방법 감사 합니다.

원본 방법이 비효율적인 이유는 쿼리를 던질때 마다 각 열에 임시로 컬럼을 만든 후 RAND() 함수로 인서트 후 정렬하는 것과 같기 때문입니다.

간단하면서도 효율적인 방법이군요.

필요 할 때 잘 사용 하도록 하겠습니다.

milosz / 2012/11/29 15:03:33 / 추천 0
검색해보니 다른 방법도 있네요. 서브쿼리를 이용하는 방법입니다.
추가 필드 안만들어도 되는 장점이 있네요. 이것도 인덱스 타고 가져오니 확인해보세요.
select *
  from tb_member
 where member_id >= rand() * (select max(member_id) from a)
 order by member_id
 limit 1;

니삼 / 2012/11/29 18:44:33 / 추천 0
milosz//
좋은정보 감사합니다