인덱스(Index)
데이터 베이스의 테이블 안에서 데이터를 빠르게 찾을 수 있는 하나의 장치이다. 인덱스는 책의 마지막 부분에 있는 색인과 같다.
책의 수많은 본문이 있고 그 본문 안에 찾고자 하는 부분을 색인을 통해서 빠르게 찾을 수 있다. 이와 같이 인덱스를 설정하면 테이블에서 찾고자 하는 데이터를 빠르게 찾을 수 있다.
B-Tree
인덱스는 보통 B-tree라는 자료구조로 이루어져있으며 트리는 루트 노드, 리프 노드, 브랜치 노드로 나뉜다.
트리 탐색은 루트 노드부터 탐색하여 브랜치 노드를 거쳐 리프노드까지 내려오면서 탐색한다.
인덱스가 효율적인 이유와 대수확장성
인덱스가 효율적인 이유는 효율적으로 모든 요소에 접근할 수 있는 균형잡힌 트리 구조와 트리 깊이의 대수 확장성 때문이다.
대수확장성이란 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것을 의미하는데, 인덱스가 한 깊이씩 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가한다.
트리의 대수확장성
트리 깊이 | 인덱스 항목의 수 |
3 | 64 |
4 | 256 |
5 | 1,024 |
6 | 4,096 |
7 | 16,384 |
8 | 65,536 |
9 | 262,144 |
10 | 1,048,576 |
트리 깊이 10으로 100만 개의 레코드를 검색할 수 있다는 의미로 실제 인덱스는 이것보다 훨씬 더 효율적이다.
인덱스 만드는 법
인덱스를 만드는 법은 데이터 베이스마다 다르다.
MySQL
MySQL의 경우 클러스터형 인덱스와 세컨더리형 인덱스가 있다.
- 클러스터형 인덱스
- 테이블당 하나를 설정할 수 있다.
- "primary key" 옵션을 사용하여 기본키로 만들거나 기본키로 만들지 않고 "unique not null" 옵션을 붙이면 만들 수 있다.
- 세컨더리 인덱스
- create index... 명령어를 기반으로 만들 수 있다.
- 보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 사용하는 인덱스이다.
⭐️ 하나의 인덱스만 생성한다면 클러스터형 인덱스를 생성하는 것이 세컨더리 인덱스를 생성하는 것 보다 성능이 좋다.
하나의 필드만으로 쿼리를 보낸다면 클러스터형 인덱스, 다양한 필드를 기반으로 쿼리를 보낼 때는 세컨더리 인덱스를 사용하는 것이 좋다.
MongoDB
도큐먼트를 만들면 자동으로 ObjectID가 형성되며 해당 키가 기본키로 설정된다. 그리고 세컨더리키도 부가적으로 설정해서 기본키와 세컨더리 키를 같이 쓰는 복합 인덱스를 설정할 수 있다.
인덱스 최적화 기법
- 인덱스는 비용이다.
- 인덱스는 두 번 탐색하도록 강요한다. 인덱스 리스트 다음 컬렉션 순으로 탐색하기 때문에 관련 읽기 비용이 든다.
- 컬렉션이 수정되었을 때 인덱스도 수정되어야 한다.
- 따라서 쿼리에 있는 필드에 인덱스를 다 설정하는 것은 비효율적이며 컬렉션에서 가져와야 하는 데이터의 양이 많을수록 인덱스를 사용하는 것은 비효율적이다.
- 항상 테스팅하라
- 인덱스 최적화 기법은 서비스 특징에 따라 달라지며 서비스에서 사용하는 객체의 깊이, 테이블의 양 등이 다르기 때문에 테스팅을 하는 것은 매우 중요하다.
- explain() 함수를 통해 인덱스를 생성하고 쿼리를 보낸 이후에 테스팅을 하며 걸리는 시간을 최소화해야 한다.
- 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.
- 보통 여러 필드를 기반으로 데이터를 조회할 때 복합 인덱스를 생성하는데, 인덱스를 생성할 때는 순서가 있고 생성 순서에 따라 인덱스의 성능이 달라진다. 인덱스의 생성 순서는 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 한다.
- 어떠한 값을 비교하는 ==이나 equal이라는 쿼리가 있다면 제일 먼저 인덱스로 설정
- 정렬에 쓰는 필드라면 그 다음 인덱스로 설정
- 다중 값을 출력해야 하는 필드, 즉 쿼리 자체가 > 이거나 < 등 많은 값을 출력해야 하는 쿼리에 쓰는 필드라면 나중에 인덱스를 설정
- 유니크한 값의 정도를 카디널리티라 하는데, 카디널리티가 높은 순서를 기반으로 인덱스를 생성
- ex) age와 email이 있을 때 email이 카디널리티가 더 높다. 따라서 email 필드에 대한 인덱스를 먼저 생성해야 한다.
- 보통 여러 필드를 기반으로 데이터를 조회할 때 복합 인덱스를 생성하는데, 인덱스를 생성할 때는 순서가 있고 생성 순서에 따라 인덱스의 성능이 달라진다. 인덱스의 생성 순서는 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 한다.
카디널리티
전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표로
중복도가 낮으면 카디널리티가 높다고 표현
중복도가 높으면 카디널리티가 낮다고 표현
복합인덱스
두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것이다. 하나의 컬럼으로 인덱스를 만들었을 때 보다 더 적은 데이터 분포를 보여 탐색할 데이터 수가 줄어든다.
'Book > 개발 관련 분야 정리' 카테고리의 다른 글
[CS 전공지식노트] 조인의 종류와 원리 (0) | 2023.07.25 |
---|---|
[CS 전공지식노트] 데이터 베이스 종류 (0) | 2023.07.24 |
[CS 전공지식노트] IP 주소 (0) | 2023.07.18 |
[CS 전공지식노트] 네트워크 기초(미완) (0) | 2023.07.11 |
[CS 전공지식 노트] 프로그래밍 패러다임 (0) | 2023.07.11 |