개발기록
MySQL의 B+ 트리 인덱싱: 성능 최적화의 핵심 본문
데이터베이스 성능 최적화에 있어 인덱싱은 핵심적인 역할을 합니다.
특히 MySQL에서는 B+ 트리 구조를 기본 인덱싱 메커니즘으로 사용하고 있습니다.
오늘은 MySQL의 B+ 트리 인덱싱에 대해 자세히 알아보겠습니다.
MySQL과 B+ 트리
MySQL의 InnoDB 스토리지 엔진은 기본적으로 모든 인덱스에 B+ 트리 구조를 사용합니다. 이는 다음과 같은 이유 때문입니다:
- 빠른 검색 및 삽입 성능 (O(log n))
- 범위 쿼리에 최적화된 구조
- 데이터의 정렬 상태 유지
- 효율적인 디스크 I/O
예제로 보는 MySQL의 B+ 트리 인덱싱
다음과 같은 employees 테이블이 있다고 가정해 봅시다:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
salary INT,
INDEX idx_salary (salary)
) ENGINE=InnoDB;
여기서 salary 컬럼에 인덱스를 생성했습니다. MySQL은 이 인덱스를 B+ 트리 구조로 관리합니다.
B+ 트리 구조
이제 다음 쿼리를 실행한다고 가정해 봅시다:
SELECT * FROM employees WHERE salary > 50000 AND salary < 70000;
이 쿼리를 처리하기 위한 B+ 트리의 구조는 다음과 같을 수 있습니다.

MySQL에서의 쿼리 실행 과정
- 쿼리 파서: SQL 문을 파싱하여 실행 계획을 생성합니다.
- 옵티마이저:
salary인덱스를 사용하기로 결정합니다. - 인덱스 탐색:
- 루트 노드(60000)에서 시작합니다.
- 50000 > 40000이므로 오른쪽 자식 노드(70000 | 80000)로 이동합니다.
- 50000 < 70000이므로 첫 번째 리프 노드(55000 | 58000 | 60000)로 이동합니다.
- 범위 스캔: 70000보다 작은 값을 가진 모든 리프 노드를 순차적으로 읽습니다.
- 테이블 접근: 인덱스에서 찾은 레코드 ID를 이용해 실제 테이블 데이터에 접근합니다.
- 결과 반환: 조건에 맞는 레코드들을 사용자에게 반환합니다.
MySQL B+ 트리 인덱싱의 특징
- 클러스터드 인덱스: InnoDB에서 프라이머리 키는 클러스터드 인덱스로 구성됩니다. 이는 데이터가 인덱스와 함께 저장된다는 의미입니다.
- 세컨더리 인덱스: 프라이머리 키가 아닌 컬럼에 대한 인덱스는 세컨더리 인덱스로 구성됩니다. 이 경우 리프 노드에는 실제 데이터 대신 프라이머리 키 값이 저장됩니다.
- 인덱스 온리 스캔: 쿼리에 필요한 모든 데이터가 인덱스에 포함되어 있다면, MySQL은 실제 테이블에 접근하지 않고 인덱스만으로 쿼리를 처리할 수 있습니다.
- 다중 컬럼 인덱스: MySQL은 여러 컬럼을 조합한 복합 인덱스도 지원합니다. 이 경우에도 B+ 트리 구조가 사용됩니다.
주의사항
- 인덱스 유지 비용: INSERT, UPDATE, DELETE 작업 시 B+ 트리 구조를 재조정해야 하므로 추가 비용이 발생합니다.
- 적절한 인덱스 선택: 모든 컬럼에 무분별하게 인덱스를 생성하면 오히려 성능이 저하될 수 있습니다. 쿼리 패턴을 분석하여 적절히 인덱스를 설계해야 합니다.
- 인덱스 힌트 사용: 복잡한 쿼리의 경우, MySQL의 옵티마이저가 항상 최적의 인덱스를 선택하지 못할 수 있습니다. 이런 경우 인덱스 힌트를 사용하여 특정 인덱스 사용을 강제할 수 있습니다.
결론
MySQL의 B+ 트리 인덱싱은 대부분의 상황에서 뛰어난 성능을 제공합니다. 특히 범위 검색과 정렬된 데이터 접근에서 그 효과가 두드러집니다. 하지만 항상 실제 데이터와 쿼리 패턴을 고려하여 적절히 인덱스를 설계하고 사용해야 합니다.
데이터베이스 성능 최적화는 계속해서 진화하는 분야입니다. MySQL의 새로운 버전이 출시될 때마다 인덱싱 메커니즘도 조금씩 개선되고 있으므로, 항상 최신 정보를 확인하는 것이 중요합니다.
다음에는 MySQL의 다른 고급 인덱싱 기법들과 그 활용 방안에 대해 알아보도록 하겠습니다. 궁금한 점이나 의견이 있다면 댓글로 남겨주세요!
Comments