데이터베이스에서 인덱스를 사용하는 이유 및 장단점

정체는 김태현·2022년 10월 26일
0

항해99

목록 보기
31/38

인덱스(Index)란?

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

특정 테이블의 컬럼을 인덱싱(Indexing)하면 검색을 할 때 테이블의 레코드를 전부 다 확인하는 것이 아니라 인덱싱 되어있는 자료 구조를 통해서(인덱스를 위한 별도의 메모리 공간에 데이터(key)의 물리적 주소(value)와 함께 저장된다.) 검색되기 때문에 검색 속도가 빨라지는 것이다. Index는 빠른 검색 속도뿐만 아니라 레코드 접근에 대한 효율적인 순서 매김 동작에 대한 기초를 제공한다.

인덱스를 설명할 때는 책을 통해서도 많이 비유되는데, 인덱스는 책에서 '목차'라고 생각할 수 있다. 책에서 정보를 찾을 때도 원하는 카테고리를 목차에서 찾고, 목차에 있는 페이지 번호를 통해 원하는 정보를 더 빠르게 찾을 수 있는 것과 같다.

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

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

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

인덱스를 활용하면 데이터를 조회하는 SELECT 외에도 UPDATE, DELETE의 성능이 함께 향상된다.

옵티마이저(Optimizer)

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

동작 과정을 좀 더 자세하게 살펴보면 인덱스가 설정되지 않았을 때는 데이터를 검색하게 되면 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이 더 빠르다.)

인덱스의 단점

항상 정렬된 상태를 유지하기 때문에 insert, update, delete 과정에서는 상대적으로 속도가 저하된다는 단점이 있다. TABLE의 Index 정보를 갱신하는 비용이 추가되기 때문입니다.

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

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

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

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

출처
https://blog.naver.com/youbeen2798/222847615752
https://wildeveloperetrain.tistory.com/131

profile
하나부터 열가지 다

0개의 댓글