핵심 답변
루스 인덱스 스캔(Loose Index Scan)은 인덱스를 건너뛰면서 읽어 GROUP BY에서 각 그룹의 첫 레코드만 가져오는 최적화 기법입니다.

루스 인덱스 스캔은 인덱스의 모든 레코드를 순차적으로 읽지 않고, 필요한 부분만 "느슨하게(Loose)" 건너뛰면서 읽는 스캔 방식입니다.

일반 인덱스 스캔(Tight Index Scan)이 인덱스를 처음부터 끝까지 읽는 것과 달리, 루스 스캔은 그룹의 경계를 넘어뛰면서 각 그룹의 대표 값만 읽습니다.

주로 GROUP BYMIN()/MAX() 집계 함수를 사용하는 쿼리에서 자동으로 적용됩니다.

알아야 할 배경 개념

인덱스 스캔 방식의 종류

GROUP BY와 집계 함수

GROUP BY는 특정 컬럼 값으로 레코드를 그룹핑하여 집계하는 SQL 구문입니다.

SELECT dept_id, MIN(salary)
FROM employees
GROUP BY dept_id;

일반적으로는 모든 레코드를 읽어 그룹핑하지만, 인덱스가 있고 특정 조건을 만족하면 루스 스캔이 사용됩니다.

복합 인덱스의 정렬 특성

복합 인덱스 INDEX(dept_id, salary)dept_id로 먼저 정렬되고, 같은 dept_id 내에서 salary로 정렬됩니다. 이 특성 덕분에 각 그룹의 첫 레코드만 읽어도 MIN() 값을 알 수 있습니다.

더 깊이 파고들기

동작 원리 상세

복합 인덱스 INDEX(category_id, price)가 있고 다음 쿼리를 실행한다고 가정합시다:

SELECT category_id, MIN(price)
FROM products
GROUP BY category_id;

타이트 스캔 (일반 방식)

  1. category_id=1인 모든 레코드 읽기 (100개)
  2. category_id=2인 모든 레코드 읽기 (200개)
  3. category_id=3인 모든 레코드 읽기 (150개)
  4. 450개 레코드 읽음

루스 스캔 (최적화)

  1. category_id=1첫 레코드만 읽기 (MIN)
  2. category_id=2로 점프, 첫 레코드만 읽기
  3. category_id=3으로 점프, 첫 레코드만 읽기
  4. 3개 레코드만 읽음 (150배 차이!)

루스 스캔이 가능한 조건

실행 계획 확인

EXPLAIN SELECT category_id, MIN(price)
FROM products
GROUP BY category_id;

-- Extra: Using index for group-by (scanning)

성능 이득

상황 타이트 스캔 루스 스캔 성능 차이
100만 레코드, 100개 그룹 100만 개 읽기 100개 읽기 1만 배
10만 레코드, 10개 그룹 10만 개 읽기 10개 읽기 1만 배
1만 레코드, 1천 개 그룹 1만 개 읽기 1천 개 읽기 10배

그룹 수가 적고 각 그룹의 레코드 수가 많을수록 루스 스캔의 효과가 극대화됩니다.

루스 스캔이 불가능한 경우

-- ❌ SUM은 모든 레코드 필요
SELECT category_id, SUM(price) FROM products GROUP BY category_id;

-- ❌ price는 인덱스의 두 번째 컬럼 (왼쪽 접두사 아님)
SELECT price, MIN(quantity) FROM products GROUP BY price;

-- ❌ COUNT(*)는 모든 레코드 필요
SELECT category_id, COUNT(*) FROM products GROUP BY category_id;
시각화
인덱스: (category_id, price) category_id = 1 price: 100, 150, 200, ... 1 건너뛰기! category_id = 2 price: 80, 120, 180, ... 2 category_id = 3 price: 50, 90, 140, ... 3 타이트 스캔: 모든 레코드 읽기 100 + 200 + 150 = 450개 루스 스캔: 첫 레코드만 3개! 최종 결과 category_id=1, MIN(price)=100 category_id=2, MIN(price)=80 category_id=3, MIN(price)=50

루스 스캔은 각 그룹의 첫 레코드만 읽고 나머지는 건너뛰어 극적인 성능 향상을 제공합니다.

함께 알면 좋은 개념