티스토리 뷰
안녕하십니까 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://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
- JPA
- Spring
- mobx
- data component
- react
- Java
- angular router
- JavaScript
- CSS
- React-router
- https://www.tistory.com/auth/logout/
- python3
- jQuery
- data component module
- 페이스북 로그인
- localStorage
- JSON
- data gird component
- data table component
- Router
- Python
- MySQL
- Angular
- Spring Boot
- facebook login
- 파이썬
- data grid component
- Redux
- 파이썬3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |