TIL 20210525 mongodb compound index

jiffydev·2021년 5월 27일
0

운영팀에서 사용하는 영상 관리 페이지는 현재 조회수 순으로 정렬되어 있고, 이에 맞추어 인덱스도 조회수를 기준으로 생성되어 있다.
이 부분을 최신 영상 순으로 정렬해서 보여달라는 요청이 들어와 mongodb의 인덱스를 수정해야 했다.

기존 인덱스는 다음과 같이 되어 있다.

# 1은 오름차순, -1은 내림차순
{'channelCategory': 1, 'status': 1, 'showAtYouha': 1, 'viewCount': -1}

처음에는 여기서 viewCountpublishedAt으로 수정해서 머지하면 될 것으로 판단했다.
그런데 인덱스가 생성된 것을 확인했는데도 여전히 속도가 느린 것이었다.

원인을 알아보니 이는 compound index가 가진 implicit(함축적?)한 특성 때문이었다.
위 인덱스는 4개의 인덱스를 합쳐 놓은 것이지만 {'channelCategory': 1} 이나 {'channelCategory': 1, 'status': 1} 또는 {'channelCategory': 1, 'status': 1, 'showAtYouha': 1} 와 같이 앞에서부터 쿼리한다면 부분적인 인덱스로도 동작하는 똑똑한 친구이다.

그러나 인덱스의 앞부분부터 사용하는 쿼리에만 적용이 되기 때문에 {'status': 1} 이나 {'channelCategory': 1, 'showAtYouha': 1}처럼 중간부터 쿼리하는 경우에는 인덱스가 적용되지 않는다.

현재 영상 분류 페이지는 기본적으로 전체 카테고리를 다 보여주고 있고, 프론트에서도 channelCategory는 요청하는 쿼리에 포함시키지 않았기 때문에 인덱스가 적용되지 않아 속도가 느린 것이었다.

따라서 인덱스를 다음과 같이 더 추가했다.

{'status': 1, 'showAtYouha': 1, 'viewCount': -1}

기존 인덱스는 카테고리별 정렬에 필요하기 때문에 남겨두었고, 위와 같이 인덱스를 추가함으로써 전체 카테고리에서도 인덱스를 사용할 수 있게 되었다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글