인덱스 튜닝: 커버링 인덱스, 컬럼 순서, 선택도, 인덱스가 오히려 느린 경우
인덱스가 있는데도 느리다면 인덱스를 더 만들 때가 아니라 어떤 인덱스를 어떻게 만들었는지 볼 때입니다. 이 레슨은 조회 컬럼까지 인덱스에 넣어 테이블 접근을 없애는 커버링 인덱스, 복합 인덱스의 컬럼 순서, 선택도로 인덱스 효과를 가늠하는 법을 다룹니다. 그리고 넓은 범위 조건에서 인덱스가 오히려 느린 이유와 안 쓰는 인덱스를 찾아 정리하는 법까지 봅니다.
1. 왜 배우는가
중급 09 인덱스에서 인덱스가 무엇이고 어떤 조건에서 못 쓰는지 배웠습니다. 실무에서 더 자주 묻는 것은 그다음 질문입니다. 이 쿼리에 인덱스를 어떻게 만들면 좋은지, 이미 만든 인덱스 중 지워도 되는 것이 있는지입니다.
인덱스는 읽기를 빠르게 하는 대신 쓰기를 느리게 하고 저장 공간을 씁니다. 그래서 많이 만든다고 좋아지지 않고 꼭 필요한 것만 알맞은 모양으로 만들어야 합니다. 대용량에서는 이 판단 하나가 배치 시간을 몇 배씩 바꿉니다.
이 레슨은 중급 09 인덱스와 대용량 01 실행 계획을 안다고 보고 진행합니다. 예제 데이터는 가상의 주문 5,000행이고 status 는 4종, cust 는 300종, ord_date 는 2년 범위입니다. 통계 정보와 힌트는 다음 레슨에서 다룹니다.
주의이 레슨의 Oracle, MySQL, MSSQL 실행 계획은 H2 로 재현하지 않은 도식이고 값은 예시입니다. H2 의 EXPLAIN 은 H2 형식이며 실제 DB 계획의 근거가 아닙니다. 특히 H2 는 커버링 여부와 인덱스가 더 느린 경우를 보여 주지 못해서, 이 레슨의 H2 출력은 어떤 인덱스를 고르는지 확인하는 용도로만 씁니다.