도서/모두를 위한 postgreSQL

Day17. 데이터 모델링과 인덱싱- 인덱싱이란?

joje* 2023. 8. 15. 15:05

1. 인덱스의 사전적 의미는 색인이며, 각각의 데이터에 대한 색인이라고 생각하면 된다.

 

2. 인덱스의 특징

  • 쿼리를 수행할 때, 인덱스가 없다면 모든 로우를 일일히 조회해야 한다. 인덱스는 쿼리 작업을 매우 효율적으로 만들어준다.
  • 인덱스를 만들면 새로운 로우를 생성하거나 제거하는 작업을 빈번하게 할 때 속도의 저하가 일어날 수 있다. 매번 인덱스를 업데이트 해야하기 때문이다.
  • 단순 인덱스를 만들면 해당 컬럼만 조회할 때 사용할 수 있고, 다수의 컬럼을 대상으로 조회할 때는 복합 인덱스가 효율적이다.
  • 복합 인덱스는 순서가 중요하다.
  • a-b 복합 인덱스는 a 단순 인덱스와 같은 기능을 하기 때문에 대체할 수 있다.

3. 인덱스의 구조

: 대표적인 인덱스의 구조로는 B-Tree 인덱스, 해시 인덱스, GIN 인덱스가 있다.

3.1 B-Tree 인덱스

: B-Tree 인덱스는 가장 기본적인 형태의 인덱스이다. 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리구조를 의미한다.

: B-Tree 인덱스는 아래와 같은 규칙을 지닌다.

  • 각각의 노드에 있는 키들을 전부 정렬되어 있어야 한다.
  • 부모 노드의 키를 사이사이에 연결되어 있는 자식 노드들이 연결되어 있으며, 이 사이에 연결된 노드는 두 키 값사이의 값들을 가져야만 한다. 
  • 가장 상위에 있는 노드를 루트 노드라 하며, 그 밑에 연결된 노드들은 자식 노드라고 한다.

: 자료 조회 시 루트 노드부터 크기를 비교하면서, 자식 노드를 조회하는 방법을 이용해 검색을 실행한다. 즉, 루트 노드의 키 값들을 비교하며 일정 범위 내에 있는 자식 노드를 찾고, 자식 노드에 있는 값들을 비교해 값을 찾은 뒤 자료를 가리키는 포인터를 이용해 정보를 찾아낸다.

 

3.2 해시 인덱스

: 해시 인덱스는 값을 직접 인덱싱하지 않고, 값을 해시화 함수를 통해 더 작은 크기의 값으로 변경한 뒤 이 값을 기준으로 B-Tree 구조를 만든다.

: 이 방식을 이용하면, 단순 B-Tree 구조를 사용했을 때보다 인덱스 크기면에서 훨씬 작아지게 된다. 인덱스의 크기가 작아지면 인덱스를 메모리에 캐싱할 때에도 이점이 있기 때문에 장점은 꽤나 의미가 있다. 또한 값 검색 속도가 기존의 방법보다 조금 빠르다.

: 하지만, 해시화 된 값들은 인덱스 한 컬럼값들 사이의 크기 비교가 불가능해져 정렬과 비교 연산에 이 방식의 인덱스를 활용할 수 없다. 등호를 이용해서 값이 일치하는지 확인할 때만 해시 인덱스를 사용할 수 있다.

: 따라서, 해시 인덱스는 일반적인 상황에서는 사용하기 어렵고, 인덱싱하려는 컬럼 값들의 크기가 크고, 값이 잘 겹쳐지지 않으며 등호(=)를 이용한 빠른 값 검색을 해야하는 상황에 이용된다.

 

3.3 GIN

: 전문 검색을 주 목적으로 하는 인덱스이다. LIKE 연산자나 tsvector 관련 연산을 할 때 효율적인 검색이 가능하게 하는 인덱스이다. 

: 원래의 인덱스에서 키와 값을 뒤바꾼 역인덱스의 한 종류이다. 

: B-Tree 방식의 인덱스는 '컬럼에 들어있는 값' 자체를 찾을 수는 있지만, 그 값에 들어있는 여러 단어들을 검색할 때에는 사용하기 어렵다. 이러한 경우 GIN 인덱스를 사용하여 문제를 해결할 수 있다.

 

4. 컬럼 수에 따른 인덱스의 종류

4.1 단일 컬럼 인덱스

: 한 가지 종류의 인덱스 컬럼 값을 갖는 방식을 단일 컬럼 인덱스라고 부른다. 가장 대표적으로 프라이머리 키 컬럼을 갖는 인덱스가 있다. 이 방식의 인덱스를 이용하면 해당 컬럼에 어떤 값을 검색하거나, 값의 범위에 해당하는 로우를 불러올 때 사용할 수 있다.

: 예를 들어, 점수 값이 5이상 10 이하인 도큐먼트를 찾을 때 이러한 인덱스를 유용하게 사용할 수 있다.

: 단일 컬럼 인덱스의 경우, 두 가지 컬럼의 값을 동시에 일치하도록 검색하는 경우 생성한 인덱스로 한 가지 컬럼의 값을 먼저 찾은 후 다른 컬럼의 값을 하나하나 대조해서 검색해야 한다는 한계점을 지닌다.

 

4.2 복합 컬럼 인덱스

: 여러가지 컬럼을 동시에 작업을 더 효율적으로 하기 위해서 이용한다.

: 복합 컬럼 인덱스란 인덱스를 대상으로 하는 값을 여러 개의 컬럼으로 하는 인덱스를 의미한다. 복합 컬럼 인덱스는 두 컬럼의 값들을 어떻게 정렬해서 설정할지 정해주어야 한다.

 : 복합 컬럼 인덱스의 경우 역시, 항목에 대해서 색인을 만들경우 항목 중 어떤 것으로 먼저 묶을지가 매우 중요하다. 만약 컬럼의 우선순위가 중요하지 않은 상황에서는 더 포괄적인 컬럼에 우선권을 주는 것이 좋다.