상세 컨텐츠

본문 제목

DB 인덱스(Index) - 개념

DataBase/개념

by Chan.94 2022. 7. 1. 17:04

본문

반응형

인덱스란

추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조

 

책의 목차가 인덱스 역할을 한다.

원하는 내용을 찾기위해서 모든 페이지를 찾아보는 것은 많은 시간이 소요된다.

그렇기 때문에 책에는 목차가 존재한다.

인덱스는 책의 목차(색인) 역할을 한다.


TABLE의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조(인덱스)를 생성하여 빠르게 조회할 수 있도록 돕고 있다.

 

인덱스 관리

위 사진처럼 인덱스는 항상 정렬되어있어야한다. 항상 정렬되어있으려면 테이블의 데이터가 수정될 때 관리가 되어야 한다는 뜻이다.

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

 


인덱스를 사용하는 이유 (장점)

가장 큰 이유는 데이터가 정렬되어 있다는 것이다.

 

1)  WHERE절의 효율성 증가

데이터가 INSERT되면 테이블의 레코드(row : 행)는 순서가 없이 저장이 된다.

이렇게 되면 WHERE절에 특정 조건에 맞는 데이터들을 찾아낼 때도 레코드의 처음부터 끝까지 다 읽어서 검색 조건과 맞는지 비교해야 한다. 이것을 풀 테이블 스캔 (Full Table Scan), 풀 스캔(Full Scan)이라고 한다.

하지만 인덱스 테이블은 데이터들이 정렬되어 저장되어 있기 때문에 해당 조건에 맞는 데이터들을 빠르게 찾아낼 수 있는 것이다. 이것이 인덱스를 사용하는 가장 큰 이유이다.

 

2) ORDER BY절의 효율성 증가

ORDER BY에 의한 정렬 과정을 피할 수가 있다. ORDER BY는 굉장히 부하가 많이 걸리는 작업이다.

하지만 인덱스를 사용하면 이미 정렬이 되어 있기 때문에 가져오기만 하면 되기 때문이다.

 

3) MAX, MIN의 효율성 증가

인덱스를 사용하면 이미 정렬되어 있어 레코드의 시작 값과 끝 값 한 건씩만 가져오면 되기 때문에 Full Table Scan으로 테이블을 모두 뒤져서 작업하는 것보다 훨씬 효율적으로 찾을 수 있다.

 

요약

* 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
* 시스템 부하를 줄일 수 있다

 

 


인덱스 사용은 무조건 옳은 것인가? (단점)

 

장점이 있다면 단점도 있는법이다.

인덱스의 가장 큰 단점은 정렬된 상태를 계속 유지시켜줘야 한다는 점이다.

 

1) DML에 취약하다 (인덱스 관리를 위한 추가 작업이 필요)

INSERT, UPDATE, DELETE가 이루어지면 인덱스 테이블 내에 있는 값들을 다시 정렬을 해야 한다.

그리고 인덱스 테이블, 원본 테이블 두 곳의 데이터 수정 작업을 해줘야 한다는 단점도 발생한다.

그렇기 때문에 DML이 빈번한 테이블보다 검색을 위주로 하는 테이블에 인덱스를 생성하는 것이 좋다.

 

2) 무조건 인덱스 스캔이 좋은 것은 아니다

검색을 위주로 하는 테이블에 인덱스를 생성하는 것이 좋지만 무조건 검색 시에도 인덱스가 좋은 것은 아니다.

Ex)
1개의 데이터가 있는 테이블과 100만 개의 데이터가 들어 있는 테이블이 있다고 하자. 100만 개의 데이터가 들어있는 테이블이라면 풀 스캔보다는 인덱스 스캔이 유리하겠지만, 1개의 데이터가 들어있는 테이블은 굳이 인덱스 스캔 없이 풀 스캔이 빠를 것이다. 

 

3) 속도 향상을 위해 무조건 인덱스를 만드는 것은 좋지 않다

인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.

 

성능(속도) 문제가 발생하면 가장 빨리 생각하는 해결책이 인덱스 추가 생성이다.

문제가 발생할 때마다 인덱스를 생성하면서 인덱스가 쌓여가는 것은 하나의 쿼리문을 빠르게는 만들 수 있지만

전체적인 데이터베이스의 성능 부하를 초래한다. 많은 인덱스가 쌓여서 INSERT, UPDATE, DELETE 시에 부하가 발생해 전체적인 데이터베이스 성능을 저하한다.
인덱스를 생성하는 것보다는 SQL문을 좀 더 효율적으로 짜는 방향으로 나가야 한다.

인덱스 생성은 마지막 수단으로 강구해야 할 문제이다.

 


[DataBase/개념] - DB 인덱스(Index) - 생성 방법 및 컬럼순서 결정

반응형

'DataBase > 개념' 카테고리의 다른 글

SELECT 실행 순서  (0) 2022.11.23
DB 인덱스(Index) - 생성 방법 및 컬럼순서  (0) 2022.07.03

관련글 더보기

댓글 영역

>