Data/MySQL

[MySQL] 인덱스 동작 원리 및 최적화

누구세연 2024. 8. 4. 21:07

인덱스의 동작원리에 대해 알아보겠습니다 📝

 

인덱스란 무엇인가?

인덱스는 데이터베이스 테이블에서 데이터를 더 빠르게 검색할 수 있도록 도와주는 데이터 구조입니다.

인덱스는 책의 색인처럼 동작하여, 특정 데이터를 빠르게 찾을 수 있게 합니다.

MySQL에서는 주로 B-Tree와 Hah 인덱스를 사용합니다.

 

인덱스의 동작 원리

B-Tree 인덱스

가장 널리 사용되는 인덱스 유형으로, 균형 잡힌 트리 구조를 가지고 있어 검색, 삽입, 삭제 작업이 효율적으로 수행됩니다.

구성요소로는 아래와 같습니다.

  • 노드(Node): 데이터와 포인터를 포함하는 트리의 요소
  • 루트 노드(Root Node): 트리의 최상위 노드
  • 리프 노드(Leaf Node): 자식 노드가 없는 최하위 노드
  • 가지 노드(Branch Node): 루트 노드와 리프 노드 사이의 노드로, 다른 노드로 가는 포인터를 포함합니다.

다음은 예시 데이터를 갖는 B-Tree 인덱스의 다이어그램입니다.

B-Tree 인덱스 다이어그램

  • 루트 노드: [20]
  • 가지 노드: [10, 15]와 [25, 30]
  • 리프 노드: [5, 7], [12], [22], [27, 35]

검색(Search) 과정 살펴보겠습니다.

예를 들어, 값 27을 검색하는 과정을 설명하겠습니다.

   1. 루트 노드에서 검색

      - 27은 20보다 크기 때문에 오른쪽 서브 트리로 이동합니다.

   2. 가지 노드에서 검색

      - 27은 25보다 크고 30보다 작기 때문에 오른쪽 서브트리로 이동합니다.

   3. 리프 노드에서 검색

     - 27을 찾습니다.

 

삽입(Insertion) 과정 살펴보겠습니다.

예를 들어, 값 13을 삽입하는 과정을 설명하겠습니다.

   1. 루트 노드에서 삽입 위치 검색

      - 13은 20보다 작기 때문에 왼쪽 서브트리로 이동합니다.

   2. 가지 노드에서 삽입 위치 검색
       - 13은 10보다 크고 15보다 작기 때문에 두 값 사이에 위치하게 됩니다.

       - 리프 노드 [12]에 13을 삽입합니다.

 

삭제(Deletion) 과정 살펴보겠습니다.

예를 들어, 값 15를 삭제하는 과정을 설명하겠습니다.

1. 루트 노드에서 삭제할 값 검색

   - 15는 20보다 작기 때문에 왼쪽 서브트리로 이동합니다.

2. 가지 노드에서 삭제할 값 검색

   - 15를 삭제하고 나머지 값들을 재조정합니다.

이제 [10, 15]가 [10]으로 재조정되었으며, [12, 13]은 변경되지 않습니다.

 

Hash 인덱스

Hash 인덱스 해시 함수를 사용하여 키 값을 인덱싱하며, 정확한 매칭 검색에 매우 유리합니다.

해시 인덱스 다이어그램

  1. 해시 함수는 각 "username" 값을 해시 값으로 변환합니다.
  2. 해시 테이블은 이 해시 값을 키로 사용하여 실제 데이터 위치를 저장합니다.

검색, 삽입, 삭제 작업은 해시 값을 사용하여 해시 테이블을 통해 즉시 접근할 수 있습니다.

 

인덱스 최적화

 

  • 쿼리 분석: 쿼리 실행 계획을 확인하여 인덱스가 효과적으로 사용되고 있는지 분석합니다.
EXPLAIN SELECT * FROM employees WHERE lastname = 'Smith';
  • 인덱스 재구성: 필요한 경우 인덱스를 재구성하여 성능을 최적화합니다.
ALTER TABLE employees DROP INDEX idx_lastname, ADD INDEX idx_lastname_new(lastname);
  • 적절한 인덱스 사용: 빈번히 사용되는 검색 조건, 조인 조건, 정렬 기준 등을 기반으로 인덱스를 생성합니다.

 

 

인덱스 사용 시 고려 사항

 

  • 과도한 인덱스 생성: 너무 많은 인덱스를 생성하면, 삽입과 삭제 작업이 느려질 수 있습니다.
  • 적절한 인덱스 선택: 빈번히 사용되는 검색 조건, 조인 조건, 정렬 기준 등을 기반으로 인덱스를 생성합니다.
  • 인덱스 유지 관리: 인덱스를 주기적으로 재구성하여 성능을 최적화합니다.

 

 

💡 인덱스는 데이터베이스의 성능 최적화에 매우 중요한 도구입니다.
B-Tree 인덱스와 Hash 인덱스의 동작 원리를 이해하고 적절하게 사용하면, 검색 성능을 크게 향상할 수 있습니다.
인덱스를 생성할 때는 쿼리 패턴을 분석하고, 필요시 인덱스를 재구성하여 최적의 성능을 유지하는 것이 중요합니다.