선 조치 후 분석

[DB] Index 개념 정리 본문

Solution/DB

[DB] Index 개념 정리

JB1104 2023. 2. 20. 18:53
728x90
반응형
SMALL

Index(인덱스)

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

특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장됩니다. (Data, Location) 형태의 (Key, Value)로 저장됩니다.
생성한 인덱스로 WHERE절에 조건으로 걸어서 쿼리를 조회한다면 옵티마이저에서 판단하여 생성된 인덱스를 탈 수 있습니다. 

 

먼저 인덱스에 저장되어 있는 물리적 주소로 가서 데이터를 가져오는 식으로 동작하여 검색 속도의 향상을 가져올 수 있습니다.

또한 인덱스 생성 시, 데이터를 오름차순으로 정렬하기 때문에 정렬된 주소체계라고 표현할 수 있습니다. 

인덱스의 가장 큰 특징은 데이터들이 정렬이 되어 있다는 점입니다. 이 특징으로 인해 조건 검색이라는 영역에서 굉장한 장점이 됩니다.


장점

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

2. 정렬 ORDER BY 절의 효율성
: 인덱스를 사용하면 ORDER BY에 의한 정렬 과정을 피할 수가 있습니다. ORDER BY는 굉장히 부하가 많이 걸리는 작업입니다.
정렬과 동시에 1차적으로 메모리에서 정렬이 이루어지고 메모리보다 큰 작업이 필요하다면 디스크 I/O도 추가적으로 발생되기 때문입니다. 하지만, 이미 인덱스 테이블에서 정렬이 되어 있기에 가져오기만 하면 이러한 ORDER BY를 통한 자원의 소모를 하지 않아도 됩니다.

3. MIN, MAX의 효율적인 처리가 가능
: 인덱스 테이블이 이미 정렬되어 있기에 가능한 장점입니다. MIN값과 MAX값을 레코드의 시작 값과 끝 값 한 건씩만 가져오면 되기 때문에 풀 스캔(Full Scan)으로 테이블 모두 뒤져서 작업하는 것보다 효율적으로 찾을 수 있습니다.

 

단점

1. 인덱스는 DML에 취약
: INSERT, UPDATE, DELETE를 통해 데이터가 추가 혹은 값이 바뀐다면 인덱스 테이블 내에 있는 값들을 다시 정렬해야 합니다.
그렇게 되면, 인덱스 테이블, 원본 테이블 2 군데의 데이터를 수정 작업을 해줘야 한다는 단점이 발생합니다.

그렇기 때문에, DML이 빈번한 테이블보다 검색을 위주로 하는 테이블에 인덱스를 생성하는 것이 좋습니다.
이런 부하를 최소화하기 위해 인덱스는 DELETE라는 개념에서 인덱스를 사용하지 않는 것이 좋습니다.

2. 무조건 인덱스 스캔이 좋은 것은 아닙니다
: 검색을 위주로 하는 테이블에서 인덱스를 생성하는 것이 좋지만 무조건 검색 시에도 인덱스가 좋은 것은 아닙니다.
인덱스는 테이블의 전체 데이터 중에서 10~15% 이하의 데이터를 처리하는 경우에만 효율적이고 그 이상의 데이터를 처리할 땐 인덱스를 사용하지 않는 것이 더 낫습니다.
(즉, 중복성이 낮은 컬럼을 인덱스로 잡아야 효율적이라는 말입니다. 예를 들어, 데이터 100건 중에서 인덱스가 남자/여자라는 컬럼으로 잡혀있다면, 못해도 5:5의 비율을 갖고 있을 가능성이 큽니다. 50건은 풀스캔을 해야 하는 상황이 발생합니다.)

3. 속도 향상을 위해 인덱스를 많이 만드는 것은 좋지 않습니다
: 인덱스를 관리하기 위해서는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요합니다. 무턱대고 인덱스를 만들어서는 결코 안된다는 것입니다. 즉, 속도 향상에 비해 단점들의 COST를 비교해서 인덱스를 만들지 말지를 정해야 합니다.



인덱스 생성 전략

: 인덱스를 가장 효율적으로 사용하려면 데이터의 분포도는 최대한으로 그리고 조건절에서의 호출 빈도는 자주 사용되는 칼럼으로 인덱스로 생성하는 것이 좋다.
인덱스는 특정 컬럼을 기준으로 생성하고 기준이 된 컬럼으로 정렬된 인덱스 테이블이 생성된다. 이 기준 컬럼은 최대한 중복이 되지 않는 값이 좋다. 가장 최선은 PK로 인덱스를 거는 것이라고 할 수 있습니다. 중복값이 없는 인덱스 테이블이 최적의 효율을 발생시킬 수 있다. 반대로 모든 값이 같은 컬럼의 인덱스 컬럼이 된다면 인덱스를 써도 아무 의미가 없다.

1. WHERE 조건으로 자주 사용되는 컬럼  
2. '='으로 비교되는 컬럼
3. 중복되는 데이터가 최소한일 컬럼 (=분포도가 좋은 컬럼)
4. ORDER BY 절에서 자주 사용되는 컬럼 
5. JOIN 조건으로 자주 사용되는 컬럼

 

1. 카디널리티(Cardinality)가 높으면 인덱스 설정에 좋은 컬럼
: 카디널리티가 높다 = 한 컬럼 값의 중복도가 낮다
: 카디널리티가 낮다 = 한 컬럼 값의 중복도가 높다
(※ 중복도가 높으면, 해당 테이블에서 인덱스를 사용해도 조회해야 하는 건수들이 많아진다.)

2. 선택도(Selectivity)가 낮으면 인덱스 설정에 좋은 컬럼
: 선택도가 높다 = 한 컬럼의 값 하나로 많은 Row를 찾을 수 있다
: 선택도가 낮다 = 한 컬럼의 값 하나로 적은 Row를 찾을 수 있다
(※ 적은 Row를 찾아야 검색 항목을 줄일 수 있다.)

3. 조회활용도 가 높을수록 인덱스 설정에 좋은 컬럼
: 해당 컬럼이 실제 얼마나 활용되는지에 대한 값
(※ WHERE 절에 얼마나 많이 사용되는가로 판단 가능.)

4. 수정빈도가 낮을수록 인덱스 설정에 좋은 컬럼
: 인덱스도 테이블이기 때문에, 인덱스로 지정된 값이 바뀌게 되면 인덱스 테이블도 수정되어야 한다
728x90
반응형
LIST