- Published on
데이터베이스 인덱스: 성능 최적화의 핵심
- Authors
- Name
- devnmin
🔄 데이터베이스 인덱스: 검색 성능 향상의 비결
인덱스는 데이터베이스의 검색 성능을 크게 향상시킬 수 있는 강력한 도구입니다. 하지만 잘못 사용하면 오히려 성능을 저하시킬 수 있습니다.
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. 인덱스 최적화 전략
🔍 인덱스 생성 기준
WHERE 절에 자주 사용되는 컬럼
-- 자주 사용되는 검색 조건 SELECT * FROM users WHERE status = 'active';
JOIN 조건에 사용되는 컬럼
-- 조인 조건 SELECT u.*, o.* FROM users u JOIN orders o ON u.id = o.user_id;
ORDER BY에 사용되는 컬럼
-- 정렬이 필요한 쿼리 SELECT * FROM users ORDER BY created_at DESC;
🔍 인덱스 사용 시 주의사항
인덱스 컬럼의 선택
- 카디널리티가 높은 컬럼 선택
- NULL 값이 많은 컬럼은 피하기
- 자주 변경되는 컬럼은 피하기
인덱스 크기 관리
- 불필요한 인덱스 제거
- 인덱스 크기 모니터링
- 정기적인 인덱스 재구성
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: 인덱스는 만능이 아닙니다. 실제 쿼리 패턴과 데이터 특성을 분석한 후, 필요한 곳에만 신중하게 적용해야 합니다.
🔍 추가 학습 자료
인덱스 튜닝 도구
- MySQL Workbench
- pt-index-usage
- MySQL Enterprise Monitor
성능 모니터링
- SHOW PROFILE
- Performance Schema
- Slow Query Log