인덱스(Index)란?

DBMS에서 조회(select)의 성능을 향상시키기 위한 목적으로 사용되는 자료구조입니다.
index를 사용해 특정 컬럼을 기준으로 정렬시켜 더 빠르게 특정 데이터에 대한 조회를 더 빠르게 할 수 있습니다.

 

 

 

인덱스의 특징

  1. 인덱스는 항상 최신의 정렬상태를 유지합니다.
  2. 인덱스도 하나의 데이터베이스 객체입니다.
  3. Index가 존재하기 위한 공간을 필요로한다.

Page란?
데이터가 저장되는 단위

 

 

 

인덱스는 어떤 자료구조로 구성 되어있을까?

인덱스는 일반적으로 B-tree 자료구조를 기반으로 구성됩니다.

b+tree 예시

페이지의 종류는 depth에 따라 3가지로 나눌 수 있습니다.

  1. 루트 페이지 - 자식 페이지의 정보를 가지고 있음
  2. 브랜치 페이지 - 자식 페이지의 정보를 가지고 있음
  3. 리프 페이지 - 실제 데이터 페이지 or 데이터의 주소 페이지를 가지고 있음

 

 

 

DML에 따른 인덱스 관리

  • 인덱스는 항상 최신의 정렬상태를 유지하는 특징이 있기때문에 쿼리가 수행될 경우 인덱스에 대한 추가적인 작업이 수반됩니다.
  1. select - 추가 작업 없음
  2. insert - 새로운 데이터로 인해 b-tree의 밸런스가 무너졌을 경우 => 페이지 분할 작업이 수행됩니다.
  3. delete - 삭제 작업 시 실제 페이지를 삭제하지 않고 페이지에 대해 사용안함 표시를 합니다. => 페이지의 낭비를 초래합니다.
  4. update - insert와 delete에서 일어나는 추가 작업이 일어납니다.페이지 분할이란?
  5. select를 제외하고는 추가 작업으로 인해 성능에 안좋은 영향을 줄 수 있습니다.
  • 페이지에 새로운 데이터를 추가할 여유 공간이 없어 페이지에 변화가 발생하는 현상
  • DB성능에 악영향을 줍니다.

 

 

 

어떤 상황에 index를 적용해야 할까?

어떤 상황에 index를 적용해야 할까?

  • 데이터 변경(삽입, 수정, 삭제) 작업이 얼마나 자주 일어나는지 고려해야 함.
  • 단일 테이블에 인덱스가 많으면 속도가 느려질 수있다. (테이블당 4~5개 권장)
  • 검색할 데이터가 전체 데이터의 20% 이상이라면, MySQL에서 인덱스를 사용하지 않음. (강제로 사용할 시 성능 저하를 초래할 수 있음)전체 페이지의 대부분을 읽어야 하고, 인덱스 관련 페이지도 읽어야 해서 작업량이 크기 때문이다.
  • 사용하지 않는 인덱스는 제거하는 것이 바람직함. (실무에서 사용하지 않는 보조 인덱스를 몇개 삭제했을 때 성능이 향상되는 경우도 많음)
  • 클러스터형 인덱스는 테이블당 하나만 생성할 수 있음
  • 테이블에 클러스터형 인덱스가 아예 없는 것이 좋은 경우도 있음
반응형

'데이터베이스' 카테고리의 다른 글

DB모델링[슈퍼타입 & 서브타입 관계]  (0) 2023.07.16

+ Recent posts