인덱스(Index)
인덱스는 데이터를 빠르게 찾을 수 있는 하나의 장치로 예를 들면 책의 마지막 장에 있는 찾아보기를 생각하면 된다.
인덱스를 설정하면 테이블 안에 내가 찾고자 하는 데이터를 빠르게 찾을 수 있다.
B-트리
인덱스는 보통 B-트리라는 자료 구조로 이루어져 있다.
트리의 탐색은 맨 위의 루트 노드부터 탐색이 일어나면서 중간에 브랜치 노드를 거치게 되고 최종적으로 리프 노드까지 내려오게 된다.
52라는 데이터를 찾는다고 가정하면 먼저 루프 노드인 39와 61을 먼저 비교하고 브랜치 노드로 내려와 다시 55와 61을 비교하게 된다.
그 후 55가 가리키는 정렬된 데이터 값을 기반으로 리프 노드를 탐색하여 원하는 52의 노드를 찾을 수 있게 된다.
B-트리가 아니라면 왼쪽부터 모든 노드를 탐색하면서 데이터를 찾게 되지만 B-트리를 통해서 데이터를 찾는다면 보다 적은 탐색으로 원하는 데이터를 찾을 수 있게 된다.
인덱스가 효율적인 이유와 대수확장성
인덱스가 효율적인 이유는 효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이의 대수확장성 때문이다.
트리 깊이 | 인덱스 항목의 수 |
2 | 16 |
3 | 64 |
4 | 256 |
5 | 1,024 |
6 | 4,096 |
7 | 16.384 |
대수확장성이란 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것을 의미한다. 기본적으로 인덱스가 한 깊이씩 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가한다.
인덱스 최적화 기법
1. 인덱스는 비용이다.
인덱스는 기본적으로 두 번 탐색하도록 강요된다. 인덱스 리스트, 그다음 컬렉션 순으로 탐색하기 때문에 관련 읽기 비용이 들게 된다.
또한 컬렉션이 수정되었을 때 인덱스도 수정되어야 한다. 이때 B-트리의 높이를 균형 있게 조절하는 비용도 들고, 데이터를 효율적으로 조회할 수 있도록 분산시키는 비용도 들게 된다.
따라서 인덱스를 무작정 다 설정하는 것은 답이 아니다. 켈렉션에서 가져와야 하는 양이 많을수록 인덱스를 사용하는 것은 비효율적이다.
2. 항상 테스팅하라
인덱스 최적화 기법은 서비스 특징에 따라 달라진다. 서비스에서 사용하는 객체의 깊이, 테이블의 양 등이 다르기 때문이다.
그렇기 때문에 항상 테스팅하는 것이 중요하다.
explain() 함수를 통해 인덱스를 만들고 쿼리를 보낸 이후에 테스팅을 하며 걸리는 시간을 최소화해야 한다.
3. 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.
여러 필드를 기반으로 조회할 때 복합 인덱스를 생성하는데, 이 인덱스를 생성할 때는 순서가 있고 생성 순서에 따라 인덱스 성능이 달라진다.
1. 어떠한 값과 같음을 비교하는 ==이나 equal이라는 쿼리가 있다면 제일 먼저 인덱스로 설정한다.
2. 정렬에 쓰는 필드라면 그다음 인덱스로 설정한다.
3. 다중 값을 출력해야 하는 필드, 즉 쿼리 자체가 > 이거나 < 등 많은 값을 출력해야 하는 쿼리에 쓰는 필드라면 나중에 인덱스를 설정한다.
Reverse Index(역색인)
역색인(Reverse Index)은 정보 검색 시스템에서 특정 용어나 용어 집합이 포함된 문서나 웹 페이지를 효율적으로 검색하는 데 사용되는 데이터 구조이다.
역색인에서 색인이 용어(단어)로 구성되며, 각 용어는 해당 용어가 포함된 문서 또는 웹페이지 목록을 가리킨다.
역색인은 단어나 숫자 등의 콘텐츠에서 문서 또는 문서 집합의 해당 위치로 매핑을 저장하는 인덱스 데이터 구조로 쉽게 말하면 단어에서 문서나 웹 페이지로 안내하는 해시맵과 같은 데이터 구조이다.
'DB' 카테고리의 다른 글
데이터베이스 - DB 이중화 (0) | 2023.11.12 |
---|---|
MySQL - View & Index (0) | 2023.11.11 |
MySQL - SELECT (1) | 2023.11.09 |
MySQL - SQL (0) | 2023.11.09 |
MySQL (0) | 2023.11.08 |