반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

인덱스 본문

CS/데이터베이스

인덱스

5_hyun 2022. 12. 20. 02:41

인덱스

인덱스의 필요성

인덱스는 데이터를 빠르게 찾을 수 있는 장치이다.

ex) 인덱스를 활용해 책 안에 찾고자 하는 항목을 빠르게 찾을 수 있다.

B-트리

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

트리 탐색은 노드 -> 브랜치 노드 -> 리프 노드를 거쳐서 내려온다. 찾는 값인 57보다 같어나 클 때까지를 기반으로 탐색하다가 리프 노드에 도착해서 57이 가리키는 데이터 포인트를 통해 값을 반환한다.

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

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

 

-대수 확장성

대수확장성은 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것을 의미한다.

트리의 깊이가 1개씩 증가하면 최대 인덱스 항목의 수는 4배씩 증가한다.

이 말은 트리 깊이 10개 짜리로, 약 100만개의 레코드를 검색할 수 있다. 실제로 인덱스는 이보다 더 효율적이다.

인덱스 최적화 기법

인덱스 최적화 기법은 DB마다 좀 다르지만 기본 골격은 같다. 아래 설명은 MongoDB를 기반으로 설명한다.

1. 인덱스는 비용

인덱스는 2번 탐색하도록 한다. 탐색 순서는 "인덱스 리스트" -> "컬렉션" 이렇게 탐색해서 읽기 비용이 든다.

책의 내용이 바뀌면 목록을 수정하듯이 컬렉션이 수정되면 인덱스도 수정해야한다. 따라서 B-트리의 높이를 균형있게 조절하고 데이터를 효율적으로 조회할 수 있게 하는 과정에서 비용이 든다. 따라서 쿼리에 있는 필드에 무작정 인덱스를 설정하면 안된다. 가져오는 양이 많을수록 인덱스는 성능이 낮아진다.

2. 테스팅

인덱스 최적화 기법은 사용하는 서비스의 객체의 깊이, 테이블 양 등에 따라 달라진다. 그렇기에 항상 테스팅하는 것이 중요하다. explain() 함수를 이용해서 인덱스를 만들고 쿼리를 보낸 이후 테스팅하면서 걸리는 시간을 줄여야한다.

3. 복합 인덱스

여러 필드를 기반으로 조회할 때 복합 인덱스를 생성한다. 복합 인덱스를 생성할 때는 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 한다. 생성 순서에 따라서 인덱스 성능이 달라지기 때문이다.

 

1. 같음: "==" 혹은 "equal" 쿼리가 있으면 제일 먼저 인덱스로 생성

2. 정렬: 정렬에 사용되는 필드면 2번째 인덱스로 설정

3. 다중 값: 쿼리가 ">" 혹은 "<" 같은 많은 값을 출력하는 다중 값 출력 필드는 3번째로 설정한다.

4. 카디널리티: 유니크한 값의 정도이며 카디널리티가 높은 순서를 기반으로 인덱스를 설정해야 한다.

ex) 성별의 카디널리티는 남, 여로 2이다. 그에 비해 나이는 여러 카디널리티가 존재하여 나이에 대한 인덱스를 먼저 생성해야 한다.

 

728x90
반응형

'CS > 데이터베이스' 카테고리의 다른 글

조인과 조인의 원리  (0) 2023.02.09
데이터베이스의 종류  (0) 2022.08.27
트랜잭션과 무결성  (1) 2022.08.17
ERD와 정규화 과정  (0) 2022.08.04
관계, 키  (0) 2022.07.19
Comments