SQL에서 복합 인덱스 사용 시학
Lukas Schneider
DevOps Engineer · Leapcell

복합 인덱스를 사용해야 하는 경우?
복합 인덱스(다중 열 인덱스라고도 함)는 여러 열에 생성된 인덱스입니다. 일반적으로 다음과 같은 시나리오에 적합합니다.
여러 조건이 포함된 쿼리(여러 열에 대한 WHERE 필터)
쿼리에 여러 조건이 포함된 경우 단일 열 인덱스는 효과적이지 않을 수 있지만 복합 인덱스는 쿼리 속도를 높일 수 있습니다.
SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
(user_id, status)에 복합 인덱스가 생성되면 쿼리는 인덱스를 효과적으로 활용할 수 있습니다.
인덱싱된 열이 쿼리에 함께 자주 나타나는 경우
col1
과 col2
가 WHERE 필터, 정렬 또는 그룹화에서 함께 자주 사용되는 경우 (col1, col2)에 복합 인덱스를 생성하는 것이 좋습니다.
쿼리가 인덱스로 커버되어야 하는 경우
SELECT 쿼리의 열이 모두 복합 인덱스에 포함된 경우 테이블 조회를 피하고 성능을 향상시켜 인덱스에서 직접 데이터를 검색할 수 있습니다(커버링 인덱스).
SELECT user_id, status FROM orders WHERE user_id = 1001;
(user_id, status) 인덱스가 있는 경우 테이블 데이터에 액세스하지 않고 인덱스에서 직접 데이터를 검색할 수 있습니다.
인덱스 열 순서가 쿼리 패턴과 일치하는 경우
MySQL은 최좌측 접두사 일치 규칙을 사용합니다. 복합 인덱스의 열 순서는 쿼리가 인덱스를 사용할 수 있는지 여부에 영향을 미칩니다.
쿼리 조건이 하나뿐인 경우 복합 인덱스가 여전히 필요한가요?
반드시 그런 것은 아닙니다. 주로 다음과 같은 상황에 따라 달라집니다.
열에 높은 선택성이 있는지 여부
쿼리된 열만으로도 선택성이 높은 경우(user_id
와 같은 높은 카디널리티) 단일 열 인덱스로 충분할 수 있습니다.
열의 선택성이 낮은 경우(예: status
에 몇 가지 가능한 값만 있음) 복합 인덱스가 더 나을 수 있습니다.
향후 쿼리에 추가 조건이 추가될지 여부
현재 쿼리가 WHERE col1 = ?
인 경우에도 나중에 col2
가 추가될 가능성이 있는 경우 (col1, col2)에 복합 인덱스를 생성하는 것이 더 적절합니다.
ORDER BY 또는 GROUP BY가 일반적인지 여부
ORDER BY col1, col2
또는 GROUP BY col1, col2
도 일반적인 경우 복합 인덱스는 정렬 및 그룹화 최적화에 도움이 됩니다.
예제 분석
user_id
만 쿼리
SELECT * FROM orders WHERE user_id = 1001;
user_id
의 선택성이 높은 경우 (user_id
)에 대한 단일 열 인덱스로 충분합니다.
그러나 status
도 자주 사용되는 필터이고 쿼리에 WHERE user_id AND status
가 자주 포함되는 경우 (user_id
, status
)에 대한 복합 인덱스를 고려하십시오.
user_id
와 status
모두 쿼리
SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
(user_id
, status
)에 대한 복합 인덱스는 (user_id
)에 대한 단일 인덱스보다 효과적입니다. status
에 대한 추가 필터링 단계가 필요하지 않기 때문입니다.
status
만 쿼리
SELECT * FROM orders WHERE status = 'shipped';
(user_id
, status
)에 대한 복합 인덱스가 있지만 status
가 최좌측 접두사가 아닌 경우 인덱스를 완전히 활용할 수 없습니다.
이 경우 (status
)에 대한 추가 단일 열 인덱스가 필요할 수 있습니다.
결론
- 단일 열 쿼리의 경우 일반적으로 단일 열 인덱스로 충분합니다. 그러나 나중에 추가 조건이 추가될 수 있는 경우 복합 인덱스가 더 적절합니다.
- 쿼리 조건에 여러 열이 포함된 경우 복합 인덱스는 여러 단일 열 인덱스보다 효율적입니다.
- 인덱스 설계는 최좌측 접두사 원칙, 쿼리 패턴, 선택성 및 인덱스가 쿼리를 커버할 수 있는지 여부와 같은 요소를 고려해야 합니다.
백엔드 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불합니다. 요청이나 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불합니다.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 높은 성능
- 고도의 동시성을 쉽게 처리할 수 있도록 자동 확장됩니다.
- 운영 오버헤드가 없으므로 구축에만 집중할 수 있습니다.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ