티스토리 뷰

데이터베이스

[데이터베이스] #6. 인덱스

ccc124213131 2021. 12. 26. 14:22
728x90

인덱스

- 테이블 안의 데이터를 쉽고 빠르게 찾을 수 있도록 만든 데이터베이스 객체

- 책에서 원하는 내용이 설명된 페이지를 목차나 색인을 통해 쉽게 찾는 것과 같은 원리

 

필요성

- 실제 데이터베이스 안의 테이블 데이터가 저장되는 곳은 디스크와 같은 보조기억장치

- SQL 실행 시 디스크로부터 필요한 데이터를 찾음

- 디스크 안의 데이터베이스 파일로부터 필요한 블록을 반복해서 주기억장치로 읽어오게 되는데, 문제는 디스크 접근 속도가 주기억장치 접근 속도보다 훨씬 느리다는 점

- 디스크 접근 횟수를 줄여 검색 속도를 높이기 위해 인덱스 사용

 

인덱스의 구조

- 대부분의 DBMS는 B-트리 구조의 인덱스 지원

- 루트노드, 중간 노드, 리프노드로 구성

- 리프노드들이 같은 레벨에 존재하는 균형 트리

- 리프 노드의 인덱스 페이지에는 데이터의 위치 정보가 저장

 

- 순차 검색은 모든 행을 순차적으로 램으로 불러와 데이터 검색, 반면 B-트리 인덱스 기반의 직접 검색은 필요한 일부 행만 램으로 불러와 직접 비교함으로써 디스크 입출력 횟수를 크게 감소

 

인덱스 생성, 삭제

 

인덱스 적용 고려사항

- 인덱스를 많이 생성한다고 검색 성능이 반드시 향상되는 것 아님

- 불필요한 인덱스는 오히려 성능을 떨어뜨리고 저장 공간만 낭비

 

인덱스 생성이 필요한 경우

- 기본키와 외래키의 경우. 대부분의 DBMS는 기본키에 대해 자동으로 인덱스 생성

- WHERE절 조건식에 자주 사용되는 테이블의 열의 경우.

- 조인 조건식에 자주 사용되는 테이블의 열

- ORDER BY, GROUP BY에 자주 사용되는 열

- 가변길이 문자형이나, 실수형, 날짜형 열보다는 정수형, 고정길이 문자형 열

 

* 하나의 테이블에는 3-5개 정도의 인덱스가 효과적

 

 

인덱스 생성이 불필요한 경우

- 갱신이 빈번한 테이블 열

- 집계 함수, 내장 함수를 적용하여 열 값을 변형하는 경우

- "성별"같은 열처럼 도메인이 작아 열의 selectivity가 높은 경우

- 범위 검색을 하는 경우

- 테이블 행의 개수가 적은 경우

댓글