Programming/Database

DB 데이터베이스 인덱스(Index) 기본 개념과 설명

Jan92 2022. 2. 12. 00:17

1. 인덱스(Index)란?

Index는 RDBMS(관계형 데이터베이스 관리 시스템)에서 테이블에 대한 검색 속도를 높여주는 자료 구조를 말하며, 테이블 내에 1개의 컬럼 혹은 여러 개의 컬럼을 이용하여 생성합니다.

특정 테이블의 컬럼을 인덱싱(Indexing)하면 검색을 할 때 테이블의 레코드를 전부 다 확인하는 것이 아니라 인덱싱 되어있는 자료 구조를 통해서 검색되기 때문에 검색 속도가 빨라지는 것입니다. Index는 빠른 검색 속도뿐만 아니라 레코드 접근에 대한 효율적인 순서 매김 동작에 대한 기초를 제공합니다.

 

인덱스를 설명할 때는 책을 통해서도 많이 비유되는데, 인덱스는 책에서 '목차'라고 생각할 수 있습니다.

책에서 정보를 찾을 때도 원하는 카테고리를 목차에서 찾고, 목차에 있는 페이지 번호를 통해 원하는 정보를 더 빠르게 찾을 수 있는 것과 같습니다.

또한 책에서도 목차 페이지가 따로 존재하는 것처럼 데이터베이스의 인덱스도 데이터베이스에서 메모리에 일정 공간을 사용해서 저장하게 됩니다.

 

 

***

인덱스에는 여러 가지 유형이 있지만 그중에서도 많이 사용되는 인덱스 구조는 B+TREE 구조입니다.

(B+TREE, B*TREE는 B-TREE의 확장 개념입니다.)

 

B-TREE 알고리즘

칼럼의 값을 변경하지 않은 채로 사용하는 인덱스 알고리즘으로 가장 범용적으로 쓰이는 인덱스 알고리즘이지만 insert, update, delete에는 비효율적입니다,

 

 

 

 

 

2. 인덱스(Index)가 동작하는 과정

인덱스가 생성되었다면, SELECT 쿼리문에서 'Index 생성 컬럼을 WHERE 조건으로 걸거나', 'Index 컬럼으로 OrderBy에 의한 Sort를 적용하는' 등의 작업을 하면 옵티마이저에서 판단하여 생성된 인덱스를 적용하여 SELECT문이 실행됩니다.

 

* 옵티마이저(Optimizer)

옵티마이저는 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진입니다.

 

 

Index 적용 예시

동작 과정을 좀 더 자세하게 살펴보면 인덱스가 설정되지 않았을 때는 데이터를 검색하게 되면 WHERE 절에 조건에 맞는 데이터를 찾아내기 위해서 테이블의 레코드를 처음부터 끝까지 다 읽으면서 검색 조건과 맞는지를 비교해야 합니다. 이것을 'Full Table Scan'이라고 합니다. 'Full Table Scan'은 가장 느린 Scanning 방법이며, 전체 데이터를 읽는 과정에서 많은 자원을 소모하게 됩니다.

 

예시를 보면 Query문을 통해 TABLE에 'Name이 HOLLY인 데이터를 조회'한다고 했을 때, Name 컬럼을 인덱싱 해놓은 상태라면 해당 Index를 통해 Name을 먼저 조회하고 Name의 Location 값을 통해 실제 TABLE에 있는 값들을 조회하기 때문에 데이터 전체를 비교할 필요가 없게 됩니다.

 

이처럼 Full Table Scan을 최소화하여 검색을 빠르게 하는 것이 Index를 사용하는 이유입니다.

 

 

 

인덱스 스캔, 데이터와 처리시간의 관계

***

인덱스 스캔에서 특정 시점까지는 'Full Table Sacn'이 더 빠를 수 있습니다.

Index를 통한 검색을 B+TREE에서 leaf node까지 찾아 내려가서 해당 데이터를 찾기 위해 디스크로 접근하는 과정을 거치는데 Full Table Scan은 B+TREE를 거치지 않고 바로 디스크에서 데이터를 읽어오기 때문입니다.

(데이터의 양이 많지 않거나, Index가 효율적으로 설정되어 있지 않은 경우는 오히려 Table Full Scan이 더 빠릅니다.)

 

 

 

 

 

3. 인덱스의 단점

앞에서의 내용을 통해 효율적으로 생성된 Index는 검색 속도를 향상한다는 장점을 확인했습니다.

하지만 인덱스를 사용했을 때의 단점 역시 존재하는데요. Index는 검색 속도를 향상하는 장점이 있지만, 항상 정렬된 상태를 유지하기 때문에 insert, update, delete 과정에서는 상대적으로 속도가 저하된다는 단점이 있습니다.

TABLE의 Index 정보를 갱신하는 비용이 추가되기 때문입니다.

 

insert : 새로운 데이터에 대한 인덱스가 추가된다.

update : 기존 인덱스를 제거하고, 갱신된 데이터에 대해 인덱스를 추가한다.

delete : 삭제하는 데이터의 인덱스를 제거한다.

 

=> 즉, 데이터 갱신보다는 조회에 주로 사용되는 컬럼에 Index를 생성하는 것이 유리합니다.

 

 

 

 

 

4. Cardinality

일반적으로 Cardinalit가 높은 컬럼을 우선적으로 인덱싱하는 것이 검색 성능에 유리합니다. Cardianlity가 높은 컬럼의 경우 Index를 통해 데이터를 더 많이 필터링할 수 있기 때문입니다.

 

Cardinality란 특정 데이터 집합의 유니크(Unique)한 값의 개수를 의미합니다.

예를 들어 사용 여부를 나타내는 useAt 컬럼이 있다고 할 때, useAt 컬럼의 경우 사용, 미사용 두 가지 값을 나타내는데 이러한 경우 중복도가 높으며, Cardinality가 낮습니다. 반면, 개인마다 고유한 값이 존재하는 주민번호 컬럼의 경우 중복도가 낮으며, Cardinality가 높습니다.

(Cardinality 외에도 Index 설정 시에는 여러 부분을 고려하여 효율적인 컬럼 선정이 이뤄져야 합니다.)

 

 

 

 

 

< 더 활용도 높은 내용의 참고 자료 >

 

mysql Index 와 다중 컬럼 인덱스

Index 개요 Index는 MYI (MySQL Index)파일에 저장 됩니다. Index가 설정되지 않았다면 Table Full Scan이 일어 나 성능이 저하 되거나 치명적인 장애가 발생 합니다. Index는 검색 속도를 향상 시키는 장점이

code-factory.tistory.com

 

 

MySQL INDEX(인덱스)를 이용한 성능 최적화 팁

MySQL 혹은 MariaDB 환경에서 1억개의 Row가 저장되어 있다고 가정하자. 인덱싱이 지정되어 있지 않은 칼럼에서 검색을 수행했을때 데이터베이스는 1억개를 Full Scan을 하게 되어 SELECT 쿼리결과가 나

www.burndogfather.com