[DB] 인덱스(Index) - Index의 장단점

Kang Dong Hyun·2023년 2월 23일
0

인덱스(Index)

인덱스는 데이터베이스 테이블에 대한 검색 성능 속도를 높여주는 자료구조이다.
특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들은 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 이렇게 인덱스를 생성했다면 앞으로 쿼리문에 where 조건에 인덱스 생성컬럼을 조건으로 걸면 옵티마이저에서 알아서 판단하여 생성된 인덱스를 탈 수가 있다. 만약 인덱스를 타게 되면 아래의 그림과 같이 인덱스를 타게되고 먼저 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오는 시으로 동작을 하여 검색 속도의 향상을 가져올 수 있다.

이름 그대로 색인이라고 생각하면 된다. 우리가 책에서 정보를 찾을 때도 책 뒤편의 색인을 보고 정보를 찾듯이 인덱스도 인덱스에서 내가 원하는 데이터를 먼저 찾고 저장되어 있는 물리적 주소로 찾아간다.

실제 DB관련 작업을 할 때 대부분의 속도 저하는 바로 select문 특히 조건 검색 where절에서 발생하는데 생각해 볼 수 있는 대안 중 하나가 인덱스(index)이다.

인덱스(Index) 왜 사용할까?

인덱스의 가장 큰 특징은 데이터들이 정렬되어 있다는 점이다.

조건 검색 where절의 효율성

테이블을 만들고 안에 데이터가 쌓이게 되면 테이블의 레코드는 내부적으로 순서가 없이 뒤죽박죽으로 저장된다. 이렇게 되면 where절에 특정 조건에 맞는 데이터들을 찾아낼 때도 레코드의 처음부터 끝까지 다 읽어서 검색 조건과 맞는지 비교해야 한다.
하지만 인덱스 테이블은 데이터들이 정렬되어 저장되어 있기 때문에 해당 조건에 맞는 데이터들을 빠르게 찾아낼 수 있다.

Order by절의 효율성

인덱스를 사용하면 Order by에 의한 정렬 과정을 피할 수 있다. Order by는 굉장히 부하가 많이 걸리는 작업이다. 정렬과 동시에 1차적으로 메모리에서 정렬이 이루어지고 메모리보다 큰 작업이 필요하다면 디스크 I/O도 추가적으로 발생한다. 하지만 인덱스를 사용하면 이미 정렬되어 있기 때문에 가져오기만 하면 된다.

MIN, MAX의 효율성

MIN값과 MAX값을 레코드의 시작값과 끝 값 한 건씩 가져오면 되기 때문에 테이블을 전부 검색하여 작업하는 것보다 훨씬 효율적으로 찾을 수 있다.

인덱스(Index)의 단점

인덱스에도 단점이 있는데 제일 큰 단점은 정렬된 상태를 계속 유지 시켜줘야 한다는 단점이 있다. 그래서 레코드 내에 데이터 값이 바뀌는 부분이라면 악영향을 미친다. INSERT, UPDATE, DELETE를 통해 데이터가 추가되거나 값이 바뀌면 INDEX 테이블 내에 있는 값들을 다시 정렬해야 하고 원본 테이블도 데이터 수정 작업을 해야 한다.

검색 시에도 인덱스가 무조건 좋은 것은 아니ㅏ다. 인덱스는 테이블의 전체 데이터 중에서 10~15%이하의 데이터를 처리하는 경우에만 효율적이고 그 이상의 데이터를 처리할 땐 인덱스를 사용하지 않고 전체를 찾는게 더 낫다고 한다. 그리고 인덱스를 관리하기 위해서는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요하다. 무턱대고 인덱스를 만들 경우 관리가 힘들어질 수 있다.

인덱스(Index)의 관리

앞서 설명했듯이 인덱스는 항상 최신의 데이터를 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색 가능하다. 그렇기 때문에 인덱스가 적용된 칼럼에서 INSERT, UPDATE, DELETE가 수행되면 그에 따른 부하가 발생한다. 이런 부하를 최소화하기 위해 인덱스는 데이터 삭제라는 개념에서 인덱스를 사용하지 않는다 라는 작업으로 이를 대신한다.

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

0개의 댓글