인덱스

98oys·2022년 9월 29일

인덱스의 필요성

데이터를 빠르게 찾을 수 있는 하나의 장치입니다.

B-Tree

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

루트, 브랜치, 리프 노드로 나뉩니다.

A~N까지의 알파벳이 있을 때 D를 순서대로 찾으면 5번 탐색을 해야하지만

B트리 구조에 저장되어있으면 2번만에 리프 노드에서 찾을 수 있습니다.

B트리의 탐색은 루트노드부터 시작하여 마지막 리프 노드에 도달해서 D이 가리키는 데이터 포인터를 통해 결괏값을 반환하게 됩니다.

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

인덱스가 효율적인 이유는 균형 잡힌 트리구조와 트리 깊이의 대수확장성 때문입니다.

대수확장성이란?

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

인덱스 종류

MySQL, MongoDB 등 데이터베이스마다 생성 방식이 다릅니다.
대표적인 MySQL의 인덱스 방식은 2가지가 있습니다.
1. 클러스터형 인덱스
2. 세컨더리 인덱스

클러스터형 인덱스

하나의 인덱스만 생성할 때 사용하는 인덱스입니다.

select * from A where age = ?

세컨더리 인덱스

보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야하는 인덱스입니다.

select * from A where age = ?, name=?, email=?

인덱스는 비용이다.

인덱스는 두 번 탐색하도록 강요합니다. 인덱스 리스트, 그다음 컬렉션 순으로 탐색하기 때문이며, 관련 읽기 비용이 들게 됩니다.

책의 본문이 수정되었을 때 목차나 찾아보기도 수정해야 하듯이 컬렉션이 수정되었을 때 인덱스도 수정되어야합니다.

따라서 컬렉션에서 가져와야 하는 양이 많을수록 인덱스 사용은 비효율적입니다.

인덱스가 항상 좋은 것은 아니다!😂

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

인덱스를 생성할 때는 순서가 있고 생성 순서에 따라 성능이 달라집니다.
같음, 정렬, 다중값, 카디널리티 순으로 생성해야합니다.

※ 카디널리티 : 유니크한 값의 정도를 말합니다.
중복도가 ‘낮으면’ 카디널리티가 ‘높다’고 표현한다.
중복도가 ‘높으면’ 카디널리티가 ‘낮다’고 표현한다.

profile
Android Developer, Department of Information and Communication Engineering, Inha University

0개의 댓글