투다 속도 개선 작업 - 1. 대댓글 보조 인덱스 설정

최민길(Gale)·2023년 1월 7일
1

안녕하세요 여러분 오늘은 투다 속도 개선을 위해 진행한 방법에 대해 포스팅해보려고 합니다ㅎㅎ

서버를 확장한 이후에도 지속적으로 속도 문제가 발생하였고, 이를 해결하기 위해 여러 방법을 찾고 있었습니다.

이 때 우연히 AWS의 성능 개선 도우미에 대해 알게 되었고 이를 통해 현재 쿼리 성능을 확인할 수 있다는 것을 알게 되어 들어가보았습니다.

보이시는 것처럼 다음의 3개의 쿼리의 실행 속도가 굉장히 느리다는 사실을 알게 되었습니다. 여기서 가장 위에 있는 부분은 대댓글 작성 시 대댓글 알림을 받는 사용자들의 알림 토큰을 조회하는 쿼리이고, 아래의 2개는 로그인 시 유저 정보 벨리데이션을 진행하는 쿼리였습니다.

따라서 해당 부분의 쿼리 성능 개선 작업을 진행했습니다. 우선 대댓글 알림을 받는 사용자들의 알림 토큰을 조회하는 쿼리에서는 부모 댓글의 아이디값을 DB에 유지하고 있었는데, 이 때 부모 댓글 없는 일반 댓글은 아이디값이 아닌 별도의 값으로 유지하고 있었습니다.

하지만 이 부분을 조인하는 과정에서 약 200만개의 데이터를 조회하다보니 속도 측면에서 딜레이가 발생하였고, 실제 쿼리를 실행한 결과 약 12초 가량의 굉장히 높은 딜레이를 보였습니다. (캡쳐를 까먹었네요.. 죄송합니다..ㅠㅠ)

따라서 이를 해결하기 위해 보조 인덱스를 설정했습니다. 인덱스를 클러스터 인덱스와 보조 인덱스가 있는데 클러스터 인덱스의 경우 PK를 생성할 때 자동적으로 생성되기 때문에 부모 댓글의 아이디값을 저장하는 컬럼에 설정하기 위해서는 댓글의 아이디값에 존재하지 않는 값이 부모 댓글 컬럼에 존재하면 안됩니다. 하지만 부모 댓글이 없는 댓글의 경우 별도 값으로 유지하고 있기 때문에 클러스터 인덱스의 경우 소요 작업이 복잡하게 됩니다.

따라서 보조 인덱스를 설정하게 되었습니다. 보조 인덱스의 경우 실제 데이터를 정렬하지 않고 인덱스 기반으로 정렬된 새로운 저장소를 만들어 탐색하는 방법입니다. 보조 인덱스가 클러스터 인덱스에 비해 조회 시 성능이 떨어지긴 하지만 댓글의 특성상 데이터 추가가 하루에 약 3천건 정도로 굉장히 빈번하게 발생하기 때문에 인덱스를 설정하지 않은 것에 비하면 꽤 높은 성능 차이를 불러와 성능 향상에 큰 영향이 있을 것이라고 판단했습니다.

따라서 보조 인덱스를 부모 댓글 컬럼에 추가하여 같은 쿼리를 실행시킨 결과 159ms 정도로 약 75배 가량으로 성능을 향상시켰습니다.


약 2시간 후 RDS 모니터링 지표를 통해 확인한 결과 latency time이 약 83배 향상된 것을 확인할 수 있습니다.

현재 남은 성능 개선 필요 부분은 로그인 시 벨리데이션 부분입니다. 추후 이 부분은 Redis 등의 캐시 DB를 사용하여 로그인 정보를 DB를 거치기 않고 빠르게 접근하여 처리할 수 있는 방법에 대해 찾아보고 적용하는 과정을 진행하려고 합니다. 또한 지속적으로 지표를 확인하여 안정적인 운영을 진행하려고 합니다. 긴 글 읽어주셔서 감사합니다!

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글