Project/타임딜 서버

인덱스를 통한 목록 조회 성능 개선

kkumta 2023. 3. 22. 23:34

https://github.com/kkumta/Time-Deal-Shop/pull/38

 

Closes #37 refactor: product 테이블에 closeDate 인덱스 추가 by kkumta · Pull Request #38 · kkumta/Time-Deal-Shop

상품 구매 마감일을 기준으로 하는 상품 목록 조회 성능을 개선했습니다. 구체적으로, 상품 구매 마감일을 기준으로 하는 상품 목록 조회 API의 응답 속도를 1/2 가량으로 단축했습니다.

github.com

해당 작업과 관련된 회고입니다.


타임딜 서버를 개발하면서, 많은 상품이 존재하는 경우 상품 목록 조회 속도생각보다 느리다는 것을 확인했습니다. 그러다 이런 경우에 어떻게 조회 성능을 개선할 수 있을지 고민해봤고, 인덱스를 떠올리게 되었습니다. 인덱스에 관해서는 책이나 원티드 프리온보딩 MySQL 세션에서 보고 들은 것이 있었습니다.

인덱스를 걸기 좋은 컬럼은, 데이터 중복이 적고, 삽입과 수정 주기가 잦지 않으며, 조회에 자주 활용되는 컬럼입니다. 이러한 조건에 따라, 마감일 순으로 상품 목록 조회 시 적용될 수 있도록, 마감일(close_date) 컬럼에 인덱스를 걸게 되었습니다. close_date 값은 날짜 값이므로 데이터 중복이 적고, 판매자가 한 번 설정한 구매 마감일을 수정하는 경우는 잦지 않을 것이라 예상되며, 이 비즈니스의 메인 조회 서비스이므로 조회가 매우 잦을 것으로 보였습니다.

 

상품 데이터는 총 7295건입니다.

우선 인덱스를 걸기 전 목록 조회 시 응답 시간은 다음과 같습니다. 이는 반올림하면 27.75ms가 되는 값입니다.

 

인덱스를 건 후 목록 조회 시 응답 시간은 다음과 같습니다. 이는 반올림하면 13.01ms가 되는 값입니다.

 

close_date에 인덱스를 설정한 것으로 인해 응답 속도가 약 2.13배 빨라진 것을 알 수 있습니다.

 

Java, Spring, JPA를 활용하는 경우에는 엔터티에 다음과 같이 인덱스를 걸 수 있습니다.

@Table(indexes = @Index(name = "index_close", columnList = "closeDate"))