2025-05-13

B-tree 인덱스 이해하기

DatabaseIndexB-treeOracleSQL

B-tree 인덱스 이해하기


인덱스란

인덱스는 "책의 목차"와 같은 역할을 합니다. 전체 테이블을 스캔하지 않고도 특정 값을 빠르게 찾을 수 있게 해줍니다. 테이블 크기가 클수록 성능 향상이 비례적으로 증가하며, Oracle은 기본적으로 B-tree 인덱스를 사용합니다.


B-tree 인덱스란

B-tree 인덱스는 정렬된 키 값을 가진 균형 트리 구조를 사용하여 O(log n) 검색 복잡도를 제공합니다.

  • Root 노드 → Branch 노드 → Leaf 노드
  • Leaf 노드는 실제 테이블 레코드를 가리키는 ROWID 포인터를 포함

트리 구조 예시:

      [50]
     /    \
 [10, 30] [60, 90]

이 구조는 범위 검색(BETWEEN, LIKE 'A%')에 탁월합니다.


인덱스 전후 성능 비교

-- 테이블 생성
CREATE TABLE users (
  id NUMBER PRIMARY KEY,
  username VARCHAR2(100),
  email VARCHAR2(100)
);
 
-- 10만 건 데이터 삽입
BEGIN
  FOR i IN 1..100000 LOOP
    INSERT INTO users VALUES (i, 'user_' || i, 'user_' || i || '@test.com');
  END LOOP;
  COMMIT;
END;
 
-- 인덱스 적용 전 검색
SET AUTOTRACE ON
SELECT * FROM users WHERE email = 'user_99999@test.com';
-- 결과: Full Table Scan
 
-- 인덱스 적용 후 검색
CREATE INDEX idx_users_email ON users(email);
 
SELECT * FROM users WHERE email = 'user_99999@test.com';
-- 결과: Index Range Scan + Table Access by ROWID

B-tree 인덱스의 특징

| 항목 | 설명 | |------|------| | 정렬 기반 | 컬럼 값을 오름차순으로 저장 | | 빠른 탐색 | O(log n) 복잡도로 수백만 건도 효율적 처리 | | 범위 검색 가능 | >, <, BETWEEN, LIKE 'A%' 지원 | | 단점 | DML 작업이 유지보수 비용을 증가시킴 |


실무 팁

  • 인덱스는 SELECT를 빠르게 하지만 DML 성능이 저하될 수 있음
  • WHERE 조건에 자주 사용되는 컬럼에 인덱스를 고려
  • ORDER BY나 JOIN에 사용되는 컬럼도 평가 대상
  • 함수 기반 인덱스로 UPPER(name) 같은 조건도 처리 가능
CREATE INDEX idx_upper_name ON users(UPPER(username));