데이터베이스에서 성능 최적화를 위해 인덱스를 적용하는 것은 일반적인 방법입니다. 하지만 때로는 인덱스를 추가했음에도 불구하고 속도가 기대만큼 개선되지 않는 상황을 경험하게 됩니다. 오늘은 이러한 상황을 실습과 함께 분석하고, 인덱스의 한계점과 해결 방안을 공유해보겠습니다.
1. 문제 상황
다음과 같은 쿼리를 실행한다고 가정해 봅시다.
SELECT * FROM customer WHERE grade = 'Silver' AND gender = 'Male';
- customer 테이블의 데이터 수: 약 100,000개.
- 조건: grade가 'Silver'이고, gender가 'Male'인 데이터를 조회.
2. 인덱스 적용 전 분석
실행 계획
'1', 'SIMPLE', 'customer', NULL, 'ALL', NULL, NULL, NULL, NULL, '99256', '1.00', 'Using where'
설명
- 타입: ALL → 테이블 전체 스캔이 수행됨.
- 스캔된 행 수: 약 99,256개.
- 비용(cost): 10,238 – 전체 데이터를 읽기 때문에 비용이 높음.
- 실제 실행 시간: 0.0738 ~ 65.5ms.
- 필터링: gender와 grade 조건을 전체 테이블에서 필터링.
결론
인덱스가 없기 때문에 MySQL은 테이블 전체를 스캔해야 합니다. 조건에 맞는 데이터만 가져오는 데 불필요한 I/O 비용이 발생하고 속도가 느립니다.
3. 인덱스 적용 후 분석
grade 컬럼에 인덱스를 생성해 봅니다.
CREATE INDEX idx_grade ON customer (grade);
실행 계획
'1', 'SIMPLE', 'customer', NULL, 'ref', 'idx_grade,idx_gender', 'idx_grade', '1023', 'const', '49628', '50.00', 'Using where' -> Filter: (customer.gender = 'Male') (cost=3420 rows=24814)
-> Index lookup on customer using idx_grade (grade='Silver') (cost=3420 rows=49628)
설명
- 타입: ref → 인덱스(idx_grade)를 사용하여 일부 행만 조회.
- 스캔된 행 수: 49,628개 → 절반으로 감소.
- 필터링된 행 수: gender = 'Male' 조건을 추가로 적용해 12,562개 행만 반환.
- 비용(cost): 3,420 → 비용이 절반 이하로 감소.
- 실제 실행 시간:
- Index Lookup: 0.137 ~ 42ms.
- 추가 필터링: 0.147 ~ 44.7ms.
결론
- idx_grade 인덱스를 사용해 grade = 'Silver' 조건을 빠르게 처리했습니다.
- 하지만 gender = 'Male' 조건이 인덱스에 포함되지 않아 추가 필터링 단계가 발생했습니다.
- 실행 시간은 줄었지만, 여전히 최적화되지 않은 부분이 남아 있습니다.
4. 성능 비교
항목인덱스 적용 전인덱스 적용 후
타입 | ALL (테이블 전체 스캔) | ref (인덱스 사용) |
스캔된 행 수 | 99,256 | 49,628 |
필터링된 행 수 | 12,562 | 12,562 |
비용 (cost) | 10,238 | 3,420 |
실제 실행 시간 | 0.0738 ~ 65.5ms | 0.137 ~ 44.7ms |
개선된 점
- 스캔된 행 수가 절반으로 줄어들었습니다.
- 비용(cost)이 절반 이하로 감소했습니다.
- 실행 시간도 개선되었지만, 여전히 추가 필터링이 남아있습니다.
5. 결론
단일 인덱스(idx_grade)를 적용한 결과, 데이터 접근 비용은 감소했지만 속도 개선이 완벽하지 않았습니다. 이유는 gender 조건에 대한 추가 필터링 작업이 남아있기 때문입니다.
해결 방안: 복합 인덱스 또는 커버링 인덱스를 활용하면 두 조건을 동시에 처리할 수 있어 더 나은 성능을 기대할 수 있습니다.
6. 다음 블로그 예고
다음 글에서는 복합 인덱스와 커버링 인덱스를 비교해보겠습니다.
마무리
이번 글을 통해 인덱스 적용 전/후 성능 차이를 비교하고, 단일 인덱스의 한계점을 확인했습니다. 다음 단계에서는 인덱스 설계를 더 최적화해 MySQL 성능을 극대화하는 방법을 배워보겠습니다.
👉 인덱스 설계를 더 최적화해 MySQL 성능을 극대화하는 방법
'SQL > 성능 최적화' 카테고리의 다른 글
커버링 인덱스로 MySQL 성능 최적화하기 (0) | 2024.12.17 |
---|---|
복합 인덱스로 성능 최적화하기 (0) | 2024.12.17 |