인덱스(Index)란?
DBMS에서 조회(select)의 성능을 향상시키기 위한 목적으로 사용되는 자료구조입니다.
index를 사용해 특정 컬럼을 기준으로 정렬시켜 더 빠르게 특정 데이터에 대한 조회를 더 빠르게 할 수 있습니다.
인덱스의 특징
- 인덱스는 항상 최신의 정렬상태를 유지합니다.
- 인덱스도 하나의 데이터베이스 객체입니다.
- Index가 존재하기 위한 공간을 필요로한다.
Page란?
데이터가 저장되는 단위
인덱스는 어떤 자료구조로 구성 되어있을까?
인덱스는 일반적으로 B-tree 자료구조를 기반으로 구성됩니다.
페이지의 종류는 depth에 따라 3가지로 나눌 수 있습니다.
- 루트 페이지 - 자식 페이지의 정보를 가지고 있음
- 브랜치 페이지 - 자식 페이지의 정보를 가지고 있음
- 리프 페이지 - 실제 데이터 페이지 or 데이터의 주소 페이지를 가지고 있음
DML에 따른 인덱스 관리
- 인덱스는 항상 최신의 정렬상태를 유지하는 특징이 있기때문에 쿼리가 수행될 경우 인덱스에 대한 추가적인 작업이 수반됩니다.
- select - 추가 작업 없음
- insert - 새로운 데이터로 인해 b-tree의 밸런스가 무너졌을 경우 => 페이지 분할 작업이 수행됩니다.
- delete - 삭제 작업 시 실제 페이지를 삭제하지 않고 페이지에 대해 사용안함 표시를 합니다. => 페이지의 낭비를 초래합니다.
- update - insert와 delete에서 일어나는 추가 작업이 일어납니다.페이지 분할이란?
- select를 제외하고는 추가 작업으로 인해 성능에 안좋은 영향을 줄 수 있습니다.
- 페이지에 새로운 데이터를 추가할 여유 공간이 없어 페이지에 변화가 발생하는 현상
- DB성능에 악영향을 줍니다.
어떤 상황에 index를 적용해야 할까?
어떤 상황에 index를 적용해야 할까?
- 데이터 변경(삽입, 수정, 삭제) 작업이 얼마나 자주 일어나는지 고려해야 함.
- 단일 테이블에 인덱스가 많으면 속도가 느려질 수있다. (테이블당 4~5개 권장)
- 검색할 데이터가 전체 데이터의 20% 이상이라면, MySQL에서 인덱스를 사용하지 않음. (강제로 사용할 시 성능 저하를 초래할 수 있음)전체 페이지의 대부분을 읽어야 하고, 인덱스 관련 페이지도 읽어야 해서 작업량이 크기 때문이다.
- 사용하지 않는 인덱스는 제거하는 것이 바람직함. (실무에서 사용하지 않는 보조 인덱스를 몇개 삭제했을 때 성능이 향상되는 경우도 많음)
- 클러스터형 인덱스는 테이블당 하나만 생성할 수 있음
- 테이블에 클러스터형 인덱스가 아예 없는 것이 좋은 경우도 있음
반응형
'데이터베이스' 카테고리의 다른 글
DB모델링[슈퍼타입 & 서브타입 관계] (0) | 2023.07.16 |
---|