프로젝트

핀테크 서비스 - 인덱스 사용

Lv.1 ysg 2024. 4. 10. 16:36

 

이게 다 얼마일까..

 

 

개인 프로젝트인 핀테크 서비스를 개발하고 피드백 받은 내용 중 인덱스를 사용해보는것이 있어 적용해보았다

 

인덱스

인덱스는 책뒤의 색인과 비슷하다 즉 어느 페이지에 어떤 단어가 있는지 대략적으로 파악할수 있게 하는것이다

아래가 그 예 이다

 

출처 : Real MySQL 위키북스 백은빈, 이성욱 지음

 

위 그림에서 "Gad"라는 인덱스 키를 갖는 레코드를 찾는다고 가정해보자.

  1. 부모 노드에서 "Gad"라는 인덱스 키가 있는지 찾아본다.
  2. Aamer는 자식 노드 2번이고, Jaana는 자식노드 3번인 것을 확인할 수 있다. 즉, "Gad"는 없는 것 처럼 보인다. 그러나 기본적으로 정렬되어 있으므로 "Aamer"와 "Jaana" 사이에 "Gad"가 있을 수 있다는 것을 알 수 있다.
  3. "Aamer"가 가리키는 자식 노드 2번 페이지로 가서 다시 탐색하는게 적절하다. ("Jaana"가 가리키는 자식노드 3번 페이지는 인덱스의 '시작 키'가 "Jaana"이기 때문에 여기에는 없다는 것을 알 수 있다.
  4. 마침 페이지 2번에 "Gad"가 있다. 만약 없었으면 앞선 단계와 같이 찾아간다. 자식노드 6번을 가리키므로 자식노드 6번 페이지로 가본다.
  5. 6번 페이지에서는 또 다른 자식 노드의 번호가 아닌 실제 프라이머리 키(기본 키)값을 알려주고 있으니 데이터 파일에서 해당 프라이머리 키를 갖는 레코드를 찾으면 인덱스 키 "Gad"의 정보를 알 수 있다.

출처: https://jeong-pro.tistory.com/242

 

MySQL 인덱스 구조와 원리의 이해

인덱스란? 어떤 문제를 해결하기 위한 기술인가 관계형 데이터베이스는 기본적으로 데이터 영속화라는 목적이 있는 기술이다. 쉽게 말하면 어떤 애플리케이션에 필요한 데이터를 유지(저장)하

jeong-pro.tistory.com

 

 

인덱스 사용 준비

인덱스가 무슨 개념인지 알았으니 인덱스를 사용해보기위해 기존에 계좌 고유번호(account_idx)로 계좌 정보(AccountEntity)를 조회하는 API가 있지만 계좌번호(acc_num)로 계좌 정보를 조회하는 API를 추가해주었다

그다음 계좌 정보 테이블(account)에 테스트 데이터 1천개를 생성해주었다 (아래 링크에서 생성했다)

https://www.mockaroo.com/

테스트 데이터 1000개 생성

 

인덱스 생성

계좌 번호(acc_num)를 통해 조회할것이기 때문에 아래 acc_num을 인덱스 컬럼으로 만들어주었다

create index idx_acc_num on account(acc_num);

인덱스 생성

 

쿼리플랜 확인

이렇게 인덱스를 생성해주고 정말 인덱스를 사용하는지 쿼리플랜을 확인해보았다

인덱스 사용X

 

??? 하지만 인덱스를 사용하지 않았다.. 왜 사용안하는지 알아본 결과 타입이 맞지 않았었다..!! 

acc_num컬럼은 문자열인데 숫자로 조회하고 있어 인덱스가 사용되고 있지 않았다

 

https://jojoldu.tistory.com/243

 

[mysql] 인덱스 정리 및 팁

MySQL 인덱스에 관해 정리를 하였습니다. MySQL을 잘 알아서 정리를 한것이 아니라, 잘 알고 싶어서 정리한 것이라 오류가 있을수도 있습니다. 1. 인덱스란? 인덱스 == 정렬 인덱스는 결국 지정한 컬

jojoldu.tistory.com

 

위 링크의 내용 그대로 주의사항을 어기고 있었다..

  • 컬럼이 문자열인데 숫자로 조회하면 타입이 달라 인덱스가 사용되지 않습니다. 정확한 타입을 사용해야만 합니다.

 

쿼리플랜 재확인

인덱스 사용

이렇게 해서 방금 만든 인덱스를 사용하는걸 확인했다 

 

성능 개선 확인

인덱스를 사용해 조회 성능이 개선이 되었는지도 궁금해져서 성능 개선을 확인해보았다

(성능테스트 툴로 jmeter를 사용했다)

 

위에서 추가한 계좌번호(acc_num)로 계좌 정보를 조회하는 API를 실행 시키도록 한 다음 성능테스트를 해봤더니 유의미한 결과를 낼수 있었다

 

아래 두 사진은 TPS를 측정한 그래프이다

 

인덱스 사용 전

 

인덱스 사용 후

 

 

사용하기 이전에는 평균 3000대 중반에 머물렀었지만 사용한 이후에는 4000 중반까지 머무른걸 확인할수 있었다

 이렇게 해서 인덱스를 사용해보았다

 

 

 

 

 

 

 

 

참고링크:

https://yermi.tistory.com/entry/MySQL-EXPLAIN%EC%9D%84-%EC%9D%B4%ED%95%B4%ED%95%98%EC%97%AC-%EC%BF%BC%EB%A6%AC-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0-MySQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%ED%83%80%EB%8A%94%EC%A7%80-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[MySQL] EXPLAIN을 이해하여 쿼리 성능 최적화하기 [MySQL 인덱스 타는지 확인하는 방법]

- EXPLAIN을 이해하여 쿼리 성능 최적화하기 1. EXPLAIN이란? EXPLAIN은 MySQL 쿼리의 실행 계획을 분석하는 데 사용되는 명령어이며, 쿼리를 실행하는 방식과 각 단계에서 어떤 작업을 수행하는지 볼 수

yermi.tistory.com

https://huisam.tistory.com/entry/index-deep-dive

 

Database - Mysql 기반으로 Index 에 대해 Deep Dive 해보자

Index 자주 사용하지만.. 잘 알고 있으신가요? 안녕하세요 ㅎㅎ 회사에 입사해서 비즈니스 통계 데이터를 추출하다 보니, 문득 그런 생각이 들었습니다. Index를 이용한 select query 를 만들고 plan 을

huisam.tistory.com

https://jaehoney.tistory.com/138

 

MySQL - 쿼리 성능(실행 시간, CPU 사용량 등) 확인하는 방법 [Profiling]

MySQL Profiling MySQL에서 실행한 쿼리들이 각 수행 시간이 얼마가 걸렸는지 확인할 수 있는 기능으로 쿼리 프로파일링(Query Profiling)을 제공합니다. profiling 설정을 활성화하면 앞으로 실행되는 모든

jaehoney.tistory.com