개요

전체 데이터를 조회하는 서비스

팀 프로젝트 진행 중, 전체 데이터에서 랜덤한 데이터를 중복없이 불러오는 기능을 담당하게 됐다.

날짜순으로 정렬된 데이터에서 최신 순으로 페이지네이션 해본 경험은 있었어도, 랜덤한 데이터를 중복없이 불러오는 것을 전체 데이터상에서 불러오는 경험은 없었기 때문에 해당 기능을 구현하는데 많은 고민이 필요했다.

디비에서의 검색 성능 기능 개선을 위해선 인덱스 적용과 페이지네이션 기법이라는 게 있다는 걸 알고 있었는데, 정확하게 알고 있다곤 하기 힘들어서 실험을 진행해보기로 했다.

왜 굳이 랜덤하게 전체 데이터를 가져와야 하나?

이번 프로젝트는 기획 자체가 상업적인 사이트가 아니라, 유저들의 데이터를 바탕으로 생성한 3D작품을 전시하는 전시회장이다.

만약 적극적으로 데이터를 수집하는 상업적인 목적의 서비스였다면, 최신의 데이터를 기준으로 정렬하는 것이 적절하나 (상단에 노출되기 위해 적극적으로 글을 쓸 것이기 때문에), 노출 빈도는 모두에게 공평하게 돌아가야 한다고 생각했고 이로 인해서 랜덤하고 중복이 없게 데이터를 조회하는 기능이 필요해진 것이다.

실험

직접 실험을 통해 최적의 인덱스를 찾아보고자 했다.

실험은 MongoDB에서 제공하는 Compass를 사용하였고, 10만개의 더미 데이터와 100만개의 더미 데이터로 15개의 데이터를 가져오는 쿼리를 각각 실험해봤다.

우리가 계획한 서비스에서는, 각 유저의 대표 갤러리만 탐색하기 때문에 100만을 넘어가는 일은 거의 없을 것이다. 따라서 실험 데이터는 최대 100만개로 충분할 것이라고 생각했다.

데이터에 대한 설명

이번 실험에서 사용하는 User의 컬럼은 두 가지이다.

실험 결과