인덱스를 활용한 데이터 성능 분석

허진혁·2023년 4월 21일
0

궁금점

많은 데이터를 탐색할 때, 인덱스 활용하면 얼마나 효율성이 증대되는지 확인하기 위해 데이터를 넣고 실험해 보려고 해요.

참고로 write가 아닌 read를 위한 성능 테스트 에요!

두가지 가정을 할거에요.
1. 맴버는 1과 2가 있다. 그리고 맴버 2에 데이터를 치중시킨다.
2. 날짜는 2010-01-01 ~ 2023-02-01 까지의 데이터만 존재

(날짜의 칼럼은 총 4445개 존재해요.)

데이터 확인

member1

member2

데이터 분석

기본적으로 사용할 idx는 다음과 같아요.

select createdDate, memberId, count(id) as count
from Post
where memberId = 2 and createdDate between '2010-01-01' and '2023-02-01'
group by memberId, createdDate;

member 1

  • 인덱스를 부여하지 않았을 때 : 566ms

  • 인덱스를 부여했을 때

    * memberId 기준 : 47ms 

    * createdDate 기준 : 18s 372ms

    * memberId, createdDate 복합 인덱스 기준 : 70ms

member 2

  • 인덱스를 부여하지 않았을 때 : 1s 540ms

  • 인덱스를 부여했을 때 : 16s 171ms

    * memberId 기준 : 17s 171ms

    * createdDate 기준 : 2s 419ms

    * memberId, createdDate 복합 인덱스 기준 : 155ms

정리

  1. 인덱스가 탐색 범위를 좁혀주지 못한다면, 인덱스 테이블 + 데이터 테이블 탐색하다보니 시간이 더 오래걸린다. (memberId 기준 인덱스 탐색, createdDate 기준 인덱스 탐색을 통해 member1과 member2 시간 비교를 통해 확인)
  2. 복합인덱스(memberId, createdDate)는 먼저 memberId 인덱스로 탐색하여 탐색범위를 줄인 후에 createdDate 인덱스로 탐색하여 효율성이 증대함.

인덱스 다룰 때 주의사항

  1. 인덱스 필드는 가공하지 않아야 해요.
  • select from User where age 10 = 1 -> 불가
  • select * from User where age = ‘1’ → 안됨 (타입이 다름)
  1. 복합 인덱스를 활용한다면, 선두 컬럼을 무엇으로 할지 중요해요.
  • 복합인덱스를 (이름, 나라)로 한다고 가정하면 이름 칼럼으로 먼저 정렬 후 이름이 같을 경우 나라 기준으로 정렬하는 것이에요.
  • 위의 복합인덱스는 where문에 (이름) 기준으로 인덱스 탐색 가능. (이름, 나라) 기준으로 인덱스 탐색 가능. but (나라) 기준으로 인덱스 탐색 불가해요.
  1. 하나의 쿼리에는 하나의 인덱스만 사용해야 해요.
  • 여러 인덱스 테이블을 동시에 탐색하지는 않아요.
  • 그래서 where, order by, group by를 혼합해서 사용한다면, 사용할 인덱스를 잘 고려해야 해요.
  1. 내 의도대로 인덱스가 작동하지 않을 수 있어요.
  • 옵티마이저는 항상 최고의 선택으 하지 않기 때문이에요.
  • 쿼리문 앞에 explain을 붙여 전략을 확인 할 수 있어요.
  1. 인덱스도 비용이라는 것을 기억해야 해요.
  • 인덱스는 쓰기를 회생해서 조회의 성능을 높이는 거에요.
  1. 인덱스 외에 방법이 있는지도 고민해야 해요.
profile
Don't ever say it's over if I'm breathing

0개의 댓글