legacy/Pin-Table 성능 개선 기록

검색 성능 개선 #9 Composite Index (복합인덱스)

2023. 2. 26. 15:42
목차
  1. Composite Index 기술 적용 이유
  2. 복합인덱스
  3. 복합인덱스 순서 선정
  4. 복합인덱스 적용
  5. 복합인덱스를 적용했는데도 왜 성능이 크게 개선되지 않았는가?
  6. 복합인덱스를 적용했음에도 Full-Scan이 발생할 수도 있다.

Composite Index 기술 적용 이유

Index 기법만으로는 특정 키워드에서 검색 범위가 너무 넓어서 여전히 성능이 좋지 않은 현상이 있었다

이를 개선하기위해서는 검색 성능을 좀 더 개선할 필요가 있었는데

Composite Index 를 적용해 검색 성능을 좀 더 개선하고자 적용했다.


복합인덱스

 - 2개이상의 컬럼으로 구성된 인덱스이다.

 - 단일인덱스를 능가하는 성능을 낼 수 있고 여러개의 인덱스를 대신 할수도 있다.

 - 조회에 대해서는 성능 개선에 도움이 되지만, 그만큼 입력/수정/삭제에 대해서는 성능 감소를 감수해야한다.

복합인덱스 순서 선정

1. 복합인덱스에서는 컬럼의 순서 또한 중요하게 선택해야 한다.

2개의 인덱스를 적용했다고 가정했을때 첫번째 인덱스를 조회하고 난 뒤에 두번째 인덱스를 조회한 결과를 출력하게 된다.

만약 첫번째 인덱스에서 조회해야할 데이터가 많고 두번째 인덱스는 적을 경우라면은

두번째 인덱스를 첫번째 인덱스로 바꿔서 복합인덱스를 걸어주는 것이 좋다.

이유는 첫번째 인덱스에서 조회된 결과를 기준으로 두번째 인덱스를 조회하기 때문에 검색 범위를 크게 줄일수 있게 된다.

 

2. 등치조건(=)과 범위조건이 있다면은 등치조건이 우선순위가 되어야 성능을 좀 더 개선할 수 있다.

이 역시 첫번째 이야기 처럼 검색 범위에 관련된 경우로 등치조건의 경우가 범위조건보다 검색 범위가 작을 가능성이

높기 때문에 이를 고려해서 복합인덱스를 걸어야 한다.

 

3. 복합인덱스의 첫번째 인덱스는 단일인덱스로도 활용이 가능하다.

복합인덱스의 첫번째 인덱스를 단일인덱스로 활용이 가능하다. 

첫번째 인덱스만 조회하고 두번째 인덱스는 조회하지 않으면 되기 때문에 복합인덱스의 순서를 잘 선택한다면

단일인덱스의 경우는 생각하지 않아도 되고 그에 따라서 인덱스의 낭비를 줄 일 수 있다.

이는 과도하게 인덱스를 걸어줌으로써 DB성능 저하에 우려가 갈 경우에 대한 대처다.


복합인덱스 적용

적용 전 (type_of_business에만 인덱스 적용)

Select * from store where type_of_business like "한식%" and star_score between 4 and 5;

0.54초가 소요되었다.

두번째 검색 조건인 star_score에서 full scan이 발생했기 때문에 이러한 시간이 나왔다.

 

적용 후 (복합인덱스 적용)

Select * from store where type_of_business like "한식%" and star_score between 4 and 5;

0.46초가 소요되었다. 검색 성능이 크게 개선되지는 않았다.

하지만 확인해보면 두번째 검색 조건에서도 인덱스를 탄것으로 나온다.


복합인덱스를 적용했는데도 왜 성능이 크게 개선되지 않았는가?

 

  • 복합 인덱스를 적용한 별점(star_score), 리뷰갯수(review_cnt) 부분이 double/ int Type이기 때문이다.
  • B-TREE Index 특성상 앞글자를 기준으로 index 처리를 하기 때문에 숫자의 범위가 넓으면 넓을수록 scan해야할 영역이 늘어나게 되고 결국 full scan과 비슷한 성능을 낼 수 밖에 없다.

복합인덱스를 적용했음에도 Full-Scan이 발생할 수도 있다.

  • 복합인덱스가 적용되어 있는 인덱스 임에도 불구하고 full scan이 발생했다.
  • ⇒ 이는 mysql의 optimizer에 의해 최선의 결과를 낼 수 있는 방식으로 실행을 시켜 준것 

만약 강제로 복합 인덱스로 타게 한다면?

Full Scan 발생 시 : 3.22초 소요

  • 복합 인덱스 강제 실행 : 3.56초 소요
    • 복합인덱스를 실행하는 것이 응답이 더 오래걸리는 것을 볼 수 있다

'legacy > Pin-Table 성능 개선 기록' 카테고리의 다른 글

검색 성능 개선 #11 Full-Text Index 검색조건  (0) 2023.02.26
검색 성능 개선 #10 Full-Text Index  (0) 2023.02.26
검색 성능 개선 #8 Optimizer에 의한 full scan 발생  (0) 2023.02.09
검색 성능 개선 #7 B-TREE index란  (0) 2023.02.09
검색 성능 개선 #6 방향성에 대한 고민2  (0) 2023.02.09
  1. Composite Index 기술 적용 이유
  2. 복합인덱스
  3. 복합인덱스 순서 선정
  4. 복합인덱스 적용
  5. 복합인덱스를 적용했는데도 왜 성능이 크게 개선되지 않았는가?
  6. 복합인덱스를 적용했음에도 Full-Scan이 발생할 수도 있다.
'legacy/Pin-Table 성능 개선 기록' 카테고리의 다른 글
  • 검색 성능 개선 #11 Full-Text Index 검색조건
  • 검색 성능 개선 #10 Full-Text Index
  • 검색 성능 개선 #8 Optimizer에 의한 full scan 발생
  • 검색 성능 개선 #7 B-TREE index란
3hoon
3hoon
3hoon
일단 적어볼게요
3hoon
전체
오늘
어제
  • 분류 전체보기 (159)
    • Computer Science (0)
    • network & Infra (0)
    • troubleshooting (3)
    • security (0)
    • algorithm (20)
    • web (54)
      • JAVA & Spring (19)
      • python & JavaScript (7)
      • JAVA & SpringBoot (28)
    • legacy (82)
      • 항해99 일지 (65)
      • Pin-Table 성능 개선 기록 (17)

블로그 메뉴

  • Github

공지사항

인기 글

태그

  • HTML
  • wil
  • 클래스
  • Query DSL
  • jquery
  • Ajax
  • 1주차
  • 항해99
  • 객체지향 프로그래밍
  • 2주차
  • TiL
  • 혼자공부하는자바
  • Python
  • OOP
  • flask
  • 프레임워크
  • 회고
  • JavaScript
  • 프로그래머스
  • Lv 1
  • Elasticsearch
  • Java
  • static
  • RDBMS
  • 알고리즘
  • This
  • RDS
  • get
  • 생성자
  • lv1

최근 댓글

최근 글

hELLO · Designed By 정상우.
3hoon
검색 성능 개선 #9 Composite Index (복합인덱스)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.