[데이터베이스] 인덱스

Ryu·2023년 5월 15일
0

인덱스란?

인덱스는 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조입니다.

B-트리

인덱스는 보통 B-트리라는 자료구조로 이루어져 있습니다.

인덱스가 효율적인 이유와 대수확장성

인덱스가 효율적인 이유는 효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이의 대수확장성 때문입니다.

대수확장성이란 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것을 의미합니다. 기본적으로 인덱스가 한 깊이씩 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가합니다.

인덱스 만드는 방법

인덱스를 만드는 방법은 데이터베이스마다 다르며 MySQL과 MongoDB를 기준으로 설명하겠습니다.

MySQL

MySQL의 경우 클러스터형 인덱스와 세컨더리 인덱스가 있습니다.
클러스터형 인덱스는 테이블당 하나를 설정할 수 있습니다. primary key 옵션으로 기본키로 만들면 클러스터형 인덱스를 생성할 수 있고, 기본키로 만들지 않고 unique not null 옵션을 붙이면 클러스터형 인덱스로 만들 수 있습니다.

세컨더리 인덱스는 create index.. 명령어를 기반으로 만들면 생성할 수 있습니다. 하나의 인덱스만 생성할 경우 클러스터형 인덱스를 만드는 것이 성능이 좋습니다.
세컨더리 인덱스는 보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야하는 인덱스입니다.

MongoDB

MongoDB의 경우 도큐먼트를 만들면 자동으로 ObjectID가 형성되며, 해당 키가 기본키로 설정됩니다. 그리고 세컨더리키도 부가적으로 설정해서 기본키와 세컨더리키를 같이쓰는 복합 인덱스를 설정할 수 있습니다.

인덱스 최적화 기법

인덱스 최적화 기법은 데이터베이스마다 조금씩 다르지만 기본적인 골조는 똑같기 때문에 MongoDB를 기반으로 설명하겠습니다.

1. 인덱스는 비용이다.

인덱스는 두 번 탐색하도록 강요합니다. 인덱스 리스트, 컬렉션 순으로 탐색하므로 관련 읽기 비용이 들게 됩니다.
또한, 컬렉션이 수정되었을 때 인덱스도 수정되어야 합니다. B-트리의 높이를 균형있게 조절하는 비용도 들고, 데이터를 효율적으로 조회할 수 있도록 분산시키는 비용도 들게 됩니다.

그렇기 때문에 컬렉션에서 가져와야하는 양이 많을수록 인덱스를 사용하는 것은 비효율적입니다.

2. 항상 테스팅하라

인덱스 최적화 기법은 서비스 특징에 따라 달라지므로 항상 테스팅하는 것이 중요합니다. explain() 함수를 통해 인덱스를 만들고 쿼리를 보낸 이후에 테스팅을 하며 걸리는 시간을 최소화해야합니다.

<SQL 테스팅 코드>
EXPLAIN
SELECT * FROM t1
JOIN t2 ON t1.c1 = t2.c1 

3. 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.

보통 여러 필드를 기반으로 조회를 할 때 복합 인덱스를 설정하는데, 이 인덱스를 생성할 때는 순서가 있고 생성 순서에 다라 인덱스 성능이 달라집니다. 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 합니다.

  1. ==이나 equal 쿼리가 있다면 제일 먼저 인덱스로 설정합니다.
  2. 정렬에 쓰는 필드라면 그 다음 인덱스로 설정합니다.
  3. 쿼리 자체가 >이거나 < 등 많은 값을 출력해야하는 쿼리에 쓰는 필드라면 나중에 인덱스를 설정합니다.
  4. 유니크한 값의 정도를 카디널리티라고 합니다. 이 카디널리티가 높은 순서를 기반으로 인덱스를 생성해야 합니다.
profile
나는야 머찐 개발자

0개의 댓글