공부/Database

[DB] 인덱스(Index)의 정의와 특징

줭♪(´▽`) 2021. 10. 13. 15:24

1. 인덱스(index)

1) 정의

- 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스에서 테이블에 대한 동작의 속도를 높여주는 자료 구조

- 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성 가능

- 책의 색인과 같은 역할

 

2) 생성

특정 컬럼에 인덱스 생성

② 해당 컬럼의 데이터들을 정렬

별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장

 

3) 사용

- Where과 같은 조건 검색에서 주로 사용

- 정렬된 인덱스에 저장되어 있는 데이터의 물리적 주소로 이동하여 데이터를 가져옴

 

2. 장단점

1) 장점

- Full Table Scan 대신 인덱스를 사용하여 검색 속도와 성능을 향상시킬 수 있음

- 전반적인 시스템의 부하를 줄일 수 있음

- 부하가 심한 ORDER BY 작업을 줄여줌

- MIN, MAX 값을 레코드의 시작값과 끝값만 가져오면 알 수 있음

 

2) 단점

- 정렬된 상태를 계속 유지시켜야 하므로 추가작업으로 인한 오버헤드 발생

- DB의 약 10%에 해당하는 저장공간을 필요로 함

- 잘못된 인덱스 사용으로 성능 저하 유발

 

3. DML에 따른 인덱스 관리

- 인덱스는 항상 정렬된 상태로 유지되어야 하기 때문에 쿼리가 수행될 경우 추가 작업이 필요함

1) SELECT

- 추가 작업 필요 없이 인덱스 사용

2) INSERT

- 새로운 데이터에 대한 인덱스를 추가 -> 가장 효율이 좋지 않음

3) DELETE

- 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행

4) UPDATE

- 기존의 인덱스를 사용하지 않음 처리하고 갱신된 데이터에 대해 인덱스를 추가

 

4. 효율적인 인덱스 사용

1) 인덱스 전략

- 인덱스는 한 테이블당 보통 3~5개 정도가 적당 (테이블의 특성과 목적에 따라 달라질 수 있음)

- 테이블의 특징을 잘 파악해서 인덱스의 개수 지정

- 컬럼의 특징을 잘 파악해서 인덱스로 설정할 컬럼 지정

 

2) 인덱스가 필요한 테이블

- 데이터의 분포도가 높은 테이블

- 규모가 작지 않은 테이블

 

3) 인덱스가 효율적인 컬럼

- 카디널리티가 높은 컬럼

카디널리티(Cardinality) : 한 컬럼이 갖고 있는 중복 정도
-> 카디널리티가 높다 = 중복도가 낮다
-> 카디널리티가 낮다 = 중복도가 높다

 

- INSERT, DELETE, UPDATE가 자주 발생하지 않는 컬럼

 

- 조건절(WHERE)에 자주 사용되는 컬럼

 

- JOIN이나 ORDER BY에 자주 사용되는 컬럼

 

- 선택도가 낮은 컬럼

선택도(Selectivity) : 데이터에서 특정 값을 얼마나 잘 선택할 수 있는지에 대한 지표
= 컬럼의 특정 값의 row 수 / 테이블의 총 row 수 * 100
= 컬럼의 값들의 평균 row 수 / 테이블의 총 row 수 * 100