핵심 답변
Index Condition Pushdown(ICP)은 WHERE 조건을 스토리지 엔진 레벨에서 먼저 평가하여 불필요한 테이블 액세스를 줄이는 MySQL 5.6+ 최적화 기법입니다.

인덱스 컨디션 푸시다운(Index Condition Pushdown, ICP)은 MySQL 5.6부터 도입된 쿼리 최적화 기법으로, WHERE 절의 조건 중 인덱스에 포함된 컬럼에 대한 조건을 스토리지 엔진 레벨에서 평가합니다.

기존에는 MySQL 서버가 모든 레코드를 가져온 후 WHERE 조건을 평가했지만, ICP를 사용하면 스토리지 엔진이 인덱스를 읽는 단계에서 조건을 먼저 체크하여 불필요한 레코드 읽기를 줄입니다.

알아야 할 배경 개념

MySQL 아키텍처: 서버 레이어 vs 스토리지 엔진 레이어

전통적으로는 스토리지 엔진이 인덱스로 레코드를 찾아 MySQL 서버에 전달하면, 서버가 WHERE 조건을 평가했습니다. ICP는 이 평가 단계를 스토리지 엔진으로 "푸시다운(밀어넣기)" 합니다.

복합 인덱스와 인덱스 레인지 스캔

복합 인덱스 INDEX(a, b, c)에서 WHERE a=1 AND b LIKE '%test' 쿼리는:

ICP 없이는 a=1인 모든 레코드를 테이블에서 읽어야 하지만, ICP를 사용하면 인덱스에서 b 조건도 먼저 체크합니다.

더 깊이 파고들기

ICP 없이 (기존 방식)

  1. 스토리지 엔진: 인덱스에서 a=1인 PK 찾기
  2. 스토리지 엔진: 모든 PK에 대해 테이블 레코드 읽기 (랜덤 I/O)
  3. MySQL 서버: 읽어온 레코드에서 b LIKE '%test' 평가
  4. 최종 결과 반환

ICP 적용 시

  1. MySQL 서버: WHERE 조건을 스토리지 엔진에 전달
  2. 스토리지 엔진: 인덱스에서 a=1인 레코드 찾기
  3. 스토리지 엔진: 인덱스에서 b LIKE '%test' 조건 평가
  4. 스토리지 엔진: 조건을 만족하는 레코드만 테이블에서 읽기
  5. 최종 결과 반환

성능 개선 효과

실행 계획 확인

EXPLAIN SELECT * FROM employees
WHERE first_name = 'John' AND last_name LIKE '%son';

-- Extra 컬럼: Using index condition

ICP가 적용되는 조건

ICP가 적용되지 않는 경우

옵티마이저 스위치

-- ICP 상태 확인
SHOW VARIABLES LIKE 'optimizer_switch';

-- ICP 비활성화 (테스트용)
SET optimizer_switch='index_condition_pushdown=off';

-- ICP 활성화 (기본값)
SET optimizer_switch='index_condition_pushdown=on';
시각화
ICP 없이 (기존) 스토리지 엔진 인덱스에서 PK 추출 모든 레코드 테이블 읽기 랜덤 I/O 많음 MySQL 서버 WHERE 조건 평가 ICP 적용 스토리지 엔진 1. 인덱스에서 조건 평가 2. 필터링된 PK만 추출 ✓ 푸시다운! 필터된 레코드 테이블 읽기 랜덤 I/O 감소! MySQL 서버 성능 개선 예: first_name='John'인 레코드 10,000개 중 last_name LIKE '%son' 조건은 100개만 만족 ICP 없이: 10,000번 테이블 읽기 | ICP 적용: 100번만 테이블 읽기 (100배 차이!)

ICP는 조건 평가를 스토리지 엔진으로 밀어넣어 불필요한 테이블 액세스를 획기적으로 줄입니다.

함께 알면 좋은 개념