DB 인덱스 적용해보기

이준기·2022년 4월 13일
0

인덱스?

인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조이다. 쉽게 예를 들면, 책에 있는 목차라고 생각하면 된다.

인덱스 컬럼 기준

조건절에 자주 등장하는 컬럼

써놓은 목차를 활용하기 위함

항상 = 으로 비교되는 컬럼

여러 인덱스를 걸었을때, 현재 컬럼이 범위 조건으로 들어간다면 다음 컬럼부터는 인덱스가 사용되지 않는다고 하므로 주의하자.

카디날리티가 높은 컬럼

카디날리티(Cardinality)란 해당 컬럼의 중복된 수치이다. 예를 들어, 성별이나 나이는 카디날리티가 낮고, 주민번호 등은 카디날리티가 높다고 한다.

인덱스로 많은 부분을 더더욱 많은 부분을 걸러내기 위해선, 분포도가 높은 (카디날리티가 높은) 컬럼을 인덱스로 잡아야 한다.

인덱스 적용해보기

대략 35만여개의 데이터가 들어있는 테이블에 테스트를 해보았다. 용량은 대략 24MB정도 된다.

공정한 비교를 위해, 적용 전과 후는 DB 조회 캐시를 삭제하지 않은 채 진행하였다.

인덱스 적용 전 속도

166ms 정도 소요된다! (200 row는 표시되는 한 페이지 갯수라 총 데이터수 랑은 관계없음)

인덱스 생성하기

day 컬럼의 목차를 위해 DAY_INDEX 이름의 인덱스를 생성해준다.

인덱스 적용 후 속도

68ms가 소요되었다.

이 정도의 데이터량만으로도 약 2.5배의 성능 향상을 내는 것 같다!

explain으로 DB 실행 계획 변화 보기

인덱스 적용 전

인덱스 적용 후

-> type이 ref로 변화했다. 인덱스를 이용하여 효과적으로 비교했다는 뜻이다. 또한, 옆에 key로 우리가 만들었던 DAY_INDEX를 사용했다고 한다.

인덱스 적용 시 주의할 점

  • 인덱스의 큰 문제점은 정렬된 상태를 항상 유지 시켜줘야 한다는 것이다.
  • 때문에 INSERT, UPDATE, DELETE를 통해 데이터가 수정된다면 테이블을 다시 매 순간 정렬시켜야 하는 추가 비용이 발생하므로, 해당 테이블이 어떤 쿼리가 많이 나갈지 고려해봐야한다.

데이터가 1만개만 넘어도 인덱스가 필수적이며, 많이 체감된다고 한다. 한번 자신의 DB에 직접 적용시켜보자.

Reference

https://jojoldu.tistory.com/243
https://www.burndogfather.com/238
https://coding-factory.tistory.com/746

profile
Hongik CE

0개의 댓글