제목 | INDEX를 이용한 랜덤 정렬 | ||
---|---|---|---|
글쓴이 | 니삼 | 작성시각 | 2012/11/29 11:04:20 |
|
|||
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//
좋은정보 감사합니다 |