Published on

데이터베이스 인덱스: 성능 최적화의 핵심

Authors
  • avatar
    Name
    devnmin
    Twitter

🔄 데이터베이스 인덱스: 검색 성능 향상의 비결

인덱스는 데이터베이스의 검색 성능을 크게 향상시킬 수 있는 강력한 도구입니다. 하지만 잘못 사용하면 오히려 성능을 저하시킬 수 있습니다.

1. 인덱스의 기본 개념

🔍 인덱스란?

  • 데이터베이스 테이블의 검색 속도를 향상시키는 자료구조
  • 책의 목차와 같은 역할
  • 추가 저장 공간이 필요

🔍 인덱스의 장단점

장점

  • 검색 성능 향상
  • 정렬 성능 향상
  • 유니크 제약 조건 보장

단점

  • 추가 저장 공간 필요
  • INSERT/UPDATE/DELETE 성능 저하
  • 인덱스 관리 비용 발생

2. 인덱스의 종류

🔍 단일 인덱스 (Single Index)

-- 기본적인 단일 인덱스 생성
CREATE INDEX idx_name ON users(name);

-- 유니크 인덱스 생성
CREATE UNIQUE INDEX idx_email ON users(email);

🔍 복합 인덱스 (Composite Index)

-- 여러 컬럼을 조합한 인덱스
CREATE INDEX idx_name_age ON users(name, age);

-- 컬럼 순서가 중요한 이유
-- 다음 쿼리는 인덱스를 사용할 수 있음
SELECT * FROM users WHERE name = 'John' AND age > 20;
-- 다음 쿼리는 인덱스를 사용할 수 없음
SELECT * FROM users WHERE age > 20;

🔍 커버링 인덱스 (Covering Index)

-- 커버링 인덱스 예시
CREATE INDEX idx_name_age_email ON users(name, age, email);

-- 인덱스만으로 쿼리 처리 가능
SELECT name, age, email FROM users WHERE name = 'John';

3. 인덱스 사용 시 고려사항

🔍 선택도 (Selectivity)

  • 인덱스의 효과를 결정하는 중요한 요소
  • 선택도 = (유니크한 값의 수) / (전체 레코드 수)
  • 일반적으로 10% 이하의 선택도가 좋음
-- 선택도 확인
SELECT
    COUNT(DISTINCT name) / COUNT(*) as selectivity
FROM users;

🔍 인덱스 사용 여부 확인

-- EXPLAIN을 사용한 실행 계획 확인
EXPLAIN SELECT * FROM users WHERE name = 'John';

-- 인덱스 사용 여부 확인
SHOW INDEX FROM users;

4. 인덱스 최적화 전략

🔍 인덱스 생성 기준

  1. WHERE 절에 자주 사용되는 컬럼

    -- 자주 사용되는 검색 조건
    SELECT * FROM users WHERE status = 'active';
    
  2. JOIN 조건에 사용되는 컬럼

    -- 조인 조건
    SELECT u.*, o.*
    FROM users u
    JOIN orders o ON u.id = o.user_id;
    
  3. ORDER BY에 사용되는 컬럼

    -- 정렬이 필요한 쿼리
    SELECT * FROM users ORDER BY created_at DESC;
    

🔍 인덱스 사용 시 주의사항

  1. 인덱스 컬럼의 선택

    • 카디널리티가 높은 컬럼 선택
    • NULL 값이 많은 컬럼은 피하기
    • 자주 변경되는 컬럼은 피하기
  2. 인덱스 크기 관리

    • 불필요한 인덱스 제거
    • 인덱스 크기 모니터링
    • 정기적인 인덱스 재구성

5. 실제 성능 테스트

🔍 인덱스 생성 전/후 비교

-- 테스트 데이터 생성
CREATE TABLE test_users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    created_at DATETIME
);

-- 인덱스 생성 전 성능 측정
SELECT * FROM test_users WHERE name = 'John';

-- 인덱스 생성
CREATE INDEX idx_name ON test_users(name);

-- 인덱스 생성 후 성능 측정
SELECT * FROM test_users WHERE name = 'John';

🔍 인덱스 사용 통계

-- 인덱스 사용 통계 확인
SHOW INDEX FROM test_users;

-- 인덱스 크기 확인
SELECT
    table_name,
    index_name,
    round(stat_value * @@innodb_page_size / 1024 / 1024, 2) as size_in_mb
FROM mysql.innodb_index_stats
WHERE stat_name = 'size';

6. 결론

인덱스는 데이터베이스 성능 최적화의 핵심 요소입니다. 적절한 인덱스 설계와 관리를 통해 검색 성능을 크게 향상시킬 수 있습니다.

💡 Tip: 인덱스는 만능이 아닙니다. 실제 쿼리 패턴과 데이터 특성을 분석한 후, 필요한 곳에만 신중하게 적용해야 합니다.

🔍 추가 학습 자료

  1. 인덱스 튜닝 도구

    • MySQL Workbench
    • pt-index-usage
    • MySQL Enterprise Monitor
  2. 성능 모니터링

    • SHOW PROFILE
    • Performance Schema
    • Slow Query Log