티스토리 뷰

DB/Mysql

Rand()를 이용한 랜덤 추출

철철22 2019. 11. 23. 19:08
반응형

안녕하십니까 Mysql을 이용하여 랜덤 값 추출을 하면서

일반적인 Rand()을 이용할 시 속도가 빠른지 의문을 가지며 알아보다가 글을 작성합니다. 

 

제가 의도한거는 다음과 같습니다.

POST 중 100개를 RANDOM으로 추출하여 사용자들에게 보여주자

 

그래서 처음에는 다음과 같은 Query를 짰습니다.

 

SELECT * FROM t_posts p ORDER BY RAND() LIMIT 100;

 

결과는 제대로 나오긴 합니다만 INDEX를 타고있는지 확인을 해보면,

제대로 타고 있는거 같진 않네요.

저기서 Using temporary는 임시 테이블에 저장하는 정렬처리 방식으로 INDEX를 활용한 처리방식보다 느리며,

Using filesort는 메모리에서 처리되는 Sort 방법입니다. 물론 data가 많아지면 느려지겠죠.

 

그래서 어떻게 하면 INDEX를 탈 수 있을지 고민하다가 Stackoverflow에 글이 올라와서 적용을 해봤습니다.

SELECT p.*
FROM t_posts p  
JOIN 
(
  SELECT post_id FROM t_posts 
  ORDER BY RAND() LIMIT 100 
) AS r ON p.post_id = r.post_id;

이렇게 이용하는 건데 바로 커버링 인덱스를 활용한 방법입니다.

 

비록 Data가 많이 없어 실행 속도는 얼마 차이가 안났지만, Data 수가 비약적으로 많을 때 INDEX를 활용한 추출을 이용한다면, 위의 QUERY 값과 차이가 날거라고 생각합니다.

 

 

 

참고 및 출처

 

Mysql 주요 처리 방식

https://12bme.tistory.com/161

 

커버링 인덱스

https://gywn.net/2012/04/mysql-covering-index/

 

Rand

https://stackoverflow.com/questions/1823306/mysql-alternatives-to-order-by-rand

 

반응형

'DB > Mysql' 카테고리의 다른 글

Mysql Backup  (0) 2020.03.01
MariaDB Row_Number  (0) 2019.12.15
Mysql 글자 대치  (0) 2019.06.04
기본 용어 및개념  (0) 2018.07.05
mysql archive 설치  (0) 2018.07.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함