[DataBase]인덱스(Index)

Jihun·2022년 4월 19일
0

데이터베이스

목록 보기
2/4
post-thumbnail

인덱스란?

데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조

Index의 목적은 RDMS의 검색 속도를 높이는 데 있다. Select 쿼리의 Where 절이나 Join 예약어를 사용했을 때 인덱스를 사용하여 쿼리의 검색 속도를 빠르게 한다. 즉, Insert, Update, Delete 성능은 다소 떨어진다.

흔히 책을 비유해서 Index를 설명하는데, 책에 있는 목차, 색인과 같은 역할을 한다. 적은 양의 데이터를 검색할 때는 양이 적기 때문에 성능 향상이 미비하다. 10쪽도 안 되는 책에서 목차와 색인이 있어봐야 공간만 차지한다. 하지만 1000쪽이 넘는 책에서는 목차와 색인이 없다면 원하는 내용을 찾기 매우 힘들다. 이와 마찬가지로 큰 데이터를 다룰 때 Index는 사용자가 검색을 요청할 때 빠르게 찾아 줄 수 있도록 기능을 제공한다.

테이블을 만들고 안에 데이터가 쌓이게 되면 테이블의 레코드(row : 행)는 내부적으로 순서가 없이 뒤죽박죽으로 저장이 된다. 이렇게 되면 WHERE절에 특정 조건에 맞는 데이터들을 찾아낼 때도 레코드의 처음부터 끝까지 다 읽어서 검색 조건과 맞는지 비교해야 한다. 이것을 풀 테이블 스캔 (Full Table Scan), 줄여서 풀 스캔(Full Scan)이라고 한다. 하지만 인덱스 테이블 스캔(Index Table Scan) 시 인덱스 테이블은 데이터들이 정렬되어 저장되어 있기 때문에 해당 조건(WHERE)에 맞는 데이터들을 빠르게 찾아낼 수 있는 것이다. 이것이 인덱스를 사용하는 가장 큰 이유이다.

또한 인덱스 생성 시 데이터를오름차순으로 정렬하기 때문에 정렬된 주소체계라고 표현할 수 있다. (아래 그림을 보면 특정 컬럼에 인덱스가 생성됐을 때 컬럼의 데이터들을 오름차순으로 정렬한 모습을 볼 수 있다.)

인덱스 동작 원리

Index가 동작하기 전 특정 컬럼에 Index를 설정했다고 가정한다. 설정한 컬럼 명은 A라고 한다. Index를 설정하면 A컬럼에 대한 Index Table이 생성된다. 컬럼 A가 포함된 Where 절 쿼리를 요청하면 Index Table에서 값을 찾게 된다. 이 상황에서 동작 순서는 다음과 같다.

  1. Index Table에서 Where절에 포함된 값을 찾는다.
  2. 찾은 값의 Table Id(PK)를 가져온다.
  3. Table Id 값으로 원본 테이블에서 값을 조회해서 반환한다.

인덱스의 관리

앞서 설명했듯이 인덱스는 항상 최신의 데이터를 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다. 그렇기 때문에 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 계속 정렬을 해주어야 하고 그에 따른 부하가 발생한다. 이런 부하를 최소화하기 위해 인덱스는 '데이터 삭제'라는 개념에서 '인덱스를 사용하지 않는다'라는 작업으로 이를 대신한다.

  • INSERT : 새로운 데이터에 대한 인덱스를 추가한다.
  • DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행한다.
  • UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가한다.

인덱스의 장단점

인덱스 장점

  • 키 값을 통해 테이블에서 검색과 정렬 속도가 향상된다.
  • 질의 및 보고서 생성 시 그룹화 작업의 속도가 향상된다.
  • 인덱스를 통해 테이블 행의 고유성을 강화시킨다.
  • 테이블 기본 키는 자동으로 인덱싱된다.

인덱스 단점

  • Index를 생성하면 공간이 커진다. 즉, .mdb 파일 크기가 늘어난다.
  • 여러 사용자(여러 응용프로그램)에서 한 페이지를 동시에 수정할 때 병행성이 떨어진다.
  • 인덱스 된 필드에서 데이터 업데이트 및 추가, 삭제할 때 성능이 떨어진다.
  • 인덱스 생성 시 시간이 많이 소요될 수 있다.
  • 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
  • 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.

인덱스를 사용하면 좋은 경우

  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  • *카디널리티가 높은 컬럼

*카디널리티가 높다: 한 컬럼이 갖고 있는 값의 중복도가 낮음. (= 값들이 대부분 다른 값을 가짐.)

참고 자료

https://coding-factory.tistory.com/746

https://mangkyu.tistory.com/96

profile
slow and steady

0개의 댓글