개인 프로젝트인 핀테크 서비스를 개발하고 피드백 받은 내용 중 인덱스를 사용해보는것이 있어 적용해보았다
인덱스
인덱스는 책뒤의 색인과 비슷하다 즉 어느 페이지에 어떤 단어가 있는지 대략적으로 파악할수 있게 하는것이다
아래가 그 예 이다
위 그림에서 "Gad"라는 인덱스 키를 갖는 레코드를 찾는다고 가정해보자.
- 부모 노드에서 "Gad"라는 인덱스 키가 있는지 찾아본다.
- Aamer는 자식 노드 2번이고, Jaana는 자식노드 3번인 것을 확인할 수 있다. 즉, "Gad"는 없는 것 처럼 보인다. 그러나 기본적으로 정렬되어 있으므로 "Aamer"와 "Jaana" 사이에 "Gad"가 있을 수 있다는 것을 알 수 있다.
- "Aamer"가 가리키는 자식 노드 2번 페이지로 가서 다시 탐색하는게 적절하다. ("Jaana"가 가리키는 자식노드 3번 페이지는 인덱스의 '시작 키'가 "Jaana"이기 때문에 여기에는 없다는 것을 알 수 있다.
- 마침 페이지 2번에 "Gad"가 있다. 만약 없었으면 앞선 단계와 같이 찾아간다. 자식노드 6번을 가리키므로 자식노드 6번 페이지로 가본다.
- 6번 페이지에서는 또 다른 자식 노드의 번호가 아닌 실제 프라이머리 키(기본 키)값을 알려주고 있으니 데이터 파일에서 해당 프라이머리 키를 갖는 레코드를 찾으면 인덱스 키 "Gad"의 정보를 알 수 있다.
출처: https://jeong-pro.tistory.com/242
인덱스 사용 준비
인덱스가 무슨 개념인지 알았으니 인덱스를 사용해보기위해 기존에 계좌 고유번호(account_idx)로 계좌 정보(AccountEntity)를 조회하는 API가 있지만 계좌번호(acc_num)로 계좌 정보를 조회하는 API를 추가해주었다
그다음 계좌 정보 테이블(account)에 테스트 데이터 1천개를 생성해주었다 (아래 링크에서 생성했다)
인덱스 생성
계좌 번호(acc_num)를 통해 조회할것이기 때문에 아래 acc_num을 인덱스 컬럼으로 만들어주었다
create index idx_acc_num on account(acc_num);
쿼리플랜 확인
이렇게 인덱스를 생성해주고 정말 인덱스를 사용하는지 쿼리플랜을 확인해보았다
??? 하지만 인덱스를 사용하지 않았다.. 왜 사용안하는지 알아본 결과 타입이 맞지 않았었다..!!
acc_num컬럼은 문자열인데 숫자로 조회하고 있어 인덱스가 사용되고 있지 않았다
https://jojoldu.tistory.com/243
위 링크의 내용 그대로 주의사항을 어기고 있었다..
- 컬럼이 문자열인데 숫자로 조회하면 타입이 달라 인덱스가 사용되지 않습니다. 정확한 타입을 사용해야만 합니다.
쿼리플랜 재확인
이렇게 해서 방금 만든 인덱스를 사용하는걸 확인했다
성능 개선 확인
인덱스를 사용해 조회 성능이 개선이 되었는지도 궁금해져서 성능 개선을 확인해보았다
(성능테스트 툴로 jmeter를 사용했다)
위에서 추가한 계좌번호(acc_num)로 계좌 정보를 조회하는 API를 실행 시키도록 한 다음 성능테스트를 해봤더니 유의미한 결과를 낼수 있었다
아래 두 사진은 TPS를 측정한 그래프이다
사용하기 이전에는 평균 3000대 중반에 머물렀었지만 사용한 이후에는 4000 중반까지 머무른걸 확인할수 있었다
이렇게 해서 인덱스를 사용해보았다
참고링크:
https://huisam.tistory.com/entry/index-deep-dive
https://jaehoney.tistory.com/138
'프로젝트' 카테고리의 다른 글
매장 예약 - Redis 캐시 적용 (0) | 2024.02.22 |
---|---|
매장 예약 서비스 - 동시성 문제 (0) | 2024.02.19 |
매장 예약 서비스 - Spring Jpa 연관 관계 (0) | 2024.02.18 |
배당금 프로젝트 (1) | 2024.01.31 |
날씨 일기 프로젝트 (0) | 2024.01.27 |