인덱스의 필요성

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

 

B+트리

  • 루트 노드, 리프 노드, 루트 노드와 리프 노드 사이에 있는 브랜치 노드로 나뉜다.
  • 예시는 아래 사진과 같다.

  • 주요 특징
    • 루트에서 리프 노드까지 거리가 항상 일정하다.
    • 하나의 노드가 여러 개의 자식 노드를 가질 수 있다. -> 대수확장성(트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것을 말한다. 기본적으로 한 깊이 증가하면 인덱스 항목의 수는 4배씩 증가한다.)
    • 리프 노드가 정렬된 상태로 서로 연결되어 있기에 범위 검색이 효율적이다.
    • 리프 노드에만 데이터에 대한 포인터가 저장되어 있다.

MySQL 인덱스 만드는 방법

  • 클러스터형 인덱스와 세컨더리 인덱스가 있다.
  • 클러스터형 인덱스는 테이블당 하나만 설정할 수 있다.
    • primary key or unique not null 옵션을 붙인 필드에 대해 클러스터형 인덱스가 생성된다.
    • 데이터 레코드가 인덱스에 따라 물리적으로 정렬되어 저장된다. 즉, 클러스터형 인덱스 정렬에 따라 레코드도 정렬된다.
  • 세컨더리 인덱스는 하나의 테이블에서 여러 개 만들 수 있다.
    • create index .. 명령어를 기반으로 만들 수 있다.
    • 데이터의 물리적 저장 순서와 무관하다.
    • 리프 노드에 실제 데이터 대신 기본 키 값을 저장한다. -> 이 기본 키 값을 가지고 클러스터형 인덱스에서 재탐색한다.

인덱스 최적화 기법

1. 인덱스는 비용이다.

데이터 삽입, 삭제 시 B-tree의 높이를 균형있게 조절하는 비용과, 데이터 수정 시 순서가 올바르지 않을 경우 재구성하는 비용이 필요하다.

 

2. 항상 테스팅하라.

서비스마다 사용하는 객체의 깊이, 테이블의 양 등이 다르기 때문에 항상 테스팅(explain)해야 한다.

 

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

여러 필드를 기반으로 조회할 때 복합 인덱스를 생성하는데, 이 인덱스를 생성할 때는 순서가 있고 생성 순서에 따라 인덱스 성능이 달라진다.

  1. 어떠한 값과 같음을 비교하는 ==와 같은 조건이 쓰이는 필드를 가장 먼저 써준다.
  2. 정렬에 쓰는 필드를 그 다음으로 써준다.
  3. 다중 값에 대한 필드, 즉 > or < 등 많은 값이 나올 수 있는 필드를 마지막으로 써준다.
  4. 유니크한 값의 정도를 카디널리티라고 하는데, 이 카디널리티가 높은 순서를 기반으로 인덱스를 생성해야 한다. 예를 들어 age와 email이 있다고 하면 email이 카디널리티가 높으므로 age와 email에 대해 == 조건이 있을 때 email을 먼저 써줘야 한다.

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

조인의 원리  (0) 2025.02.28
데이터베이스의 종류  (0) 2025.02.26
트랜잭션과 무결성  (0) 2025.02.26
ERD와 정규화 과정  (0) 2025.02.19
데이터베이스의 기본  (0) 2025.02.18

+ Recent posts