EQ Range Index Dive Limit에 대한 이해

숭맹이·2025년 2월 7일
0

eq_range_index_dive_limit란?

eq_range_index_dive_limit는 MySQL의 옵티마이저 설정 중 하나로, 범위 조건을 포함하는 쿼리에서 인덱스를 얼마나 깊이 탐색할 것인지를 결정하는 변수입니다. 기본적으로, 인덱스를 활용하여 여러 값의 선택도를 평가할 때, 일정 개수 이하의 값에 대해서만 개별적으로 통계를 조사하고, 그 이상일 경우 대략적인 카디널리티(Cardinality) 값을 사용합니다.

동작 방식

  1. 옵티마이저는 eq_range_index_dive_limit보다 작은 개수의 범위 조건이 있는 경우 개별 인덱스 통계를 조회합니다.
  2. 설정값을 초과하는 경우, 테이블 통계를 이용한 근사치를 사용합니다.
  3. 이 설정은 주로 다중 조건을 포함하는 IN() 또는 BETWEEN과 같은 쿼리에서 영향을 미칩니다.

왜 중요한가?

1. 실행 계획 최적화

데이터베이스가 인덱스를 탐색할 때, 너무 깊이 조회하면 오버헤드가 증가하지만, 너무 얕게 조회하면 부정확한 실행 계획이 선택될 가능성이 있습니다. eq_range_index_dive_limit 값을 적절히 설정하면 불필요한 탐색을 줄이고 최적의 실행 계획을 유지할 수 있습니다.

2. 대규모 데이터 처리 최적화

대량의 데이터를 다루는 환경에서는 카디널리티를 평가하는 과정이 성능에 큰 영향을 줍니다. 적절한 설정을 통해 옵티마이저가 보다 빠르고 정확한 방식으로 실행 계획을 수립하도록 도울 수 있습니다.

설정 방법

eq_range_index_dive_limit는 MySQL의 글로벌 변수 또는 세션 변수로 설정할 수 있습니다.

-- 현재 설정값 확인
SHOW VARIABLES LIKE 'eq_range_index_dive_limit';

-- 전역적으로 설정 (서버 재시작 후에도 유지됨)
SET GLOBAL eq_range_index_dive_limit = 10;

-- 세션 단위 설정 (현재 세션에서만 적용됨)
SET SESSION eq_range_index_dive_limit = 5;

언제 조정해야 할까?

  • IN() 조건에 많은 값을 포함하는 경우: 예를 들어 WHERE column IN (1,2,3,4,5,6,7,8,9,10) 같은 쿼리는 옵티마이저가 인덱스를 깊이 탐색할 필요가 있습니다.
  • 실행 계획이 예상과 다를 때: EXPLAIN을 활용하여 예상치 못한 풀 테이블 스캔이 발생하는 경우 값을 조정해 볼 수 있습니다.
  • 카디널리티가 낮은 인덱스를 사용할 때: 선택도가 낮은 경우 불필요한 인덱스 탐색을 방지하기 위해 조정이 필요할 수 있습니다.
profile
👨🏻‍💻 Backend Developer

0개의 댓글