DB 실행계획 차이: 원인 및 해결책

2026. 3. 23. 12:49·📊DB/MariaDB

🚨 문제 상황 소개

  • 개발 DB와 운영 DB, 같은 버전/같은 테이블/같은 쿼리인데 실행계획이 달라졌다.
  • 한쪽은 인덱스를 타고, 다른 한쪽은 풀스캔 + filesort 발생
  • 원인 추적 과정 간단히 설명 (EXPLAIN 결과 비교)

🧱 실행계획 차이 원인

  • 옵티마이저는 비용 기반(cost-based) 으로 플랜을 선택.
  • 이때 “선택도(selectivity)” 추정이 중요.
  • 그런데 추정 방식이 통계값만 보느냐, 실제 인덱스를 내려가 보느냐에 따라 결과가 달라짐.

⚠️ 인덱스 다이브(Index Dive)란?

  • 개념: 옵티마이저가 실제 인덱스 레벨에서 값 분포를 확인해 정확한 선택도를 계산하는 과정.
  • 장점: 더 정확한 실행계획.
  • 단점: 옵티마이저가 실행계획 계산에 시간이 조금 더 걸림.

⚙️ EQ_RANGE_INDEX_DIVE_LIMIT 파라미터

  • 역할: 인덱스 다이브를 몇 개 값까지 허용할지 결정.
  • 0 → 인덱스 다이브 안 함 → 통계 의존 → 잘못된 플랜 위험 ↑
  • 200(기본) → 200개 값까지 다이브 → 더 정확한 플랜 선택
  • 왜 운영 DB만 “0”으로 되어 있었는지, 확인 과정 설명.
### 해결방법

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

-- 세션/글로벌에서 조정
SET SESSION eq_range_index_dive_limit = 200;
SET GLOBAL eq_range_index_dive_limit = 200;

-- 영구 적용(MySQL 8 이상, MariaDB 10.3.30 version)
SET PERSIST eq_range_index_dive_limit = 200;

🔖 정리

  • 실행계획이 달라질 수 있는 이유는 데이터 분포 차이만 있는 게 아니라, 옵티마이저 파라미터 값 차이도 있다.
  • 운영/개발 환경 비교할 때는 SHOW VARIABLES 로 변수 값부터 확인.
  • 실행계획 이슈 정리 체크리스트:
    1. EXPLAIN 플랜 비교
    2. SHOW INDEX로 카디널리티 확인
    3. 관련 옵티마이저 변수(eq_range_index_dive_limit, innodb_stats_*, optimizer_switch 등) 확인
저작자표시 비영리 변경금지 (새창열림)

'📊DB > MariaDB' 카테고리의 다른 글

MariaDB: Memory 관련 개념  (0) 2026.03.22
'📊DB/MariaDB' 카테고리의 다른 글
  • MariaDB: Memory 관련 개념
Diven
Diven
  • Diven
    Diven
    Diven
  • 전체
    오늘
    어제
    • 분류 전체보기 (110) N
      • ☁️Cloud (21) N
        • AWS (2)
        • Alibaba (14) N
        • OCI (1)
        • AWS: Certified Solution Arc.. (0)
        • AWS: Certificate Advanced N.. (2) N
      • 📊DB (13)
        • MongoDB (8)
        • MariaDB (2)
        • PostgreSQL (2)
        • MySQL (1)
      • 🧑🏽‍💻Dev:Lang (9)
        • C++ (0)
        • GO (1)
        • Python (8)
      • ⚙️DevOps (4)
        • CICD (0)
        • Jenkins (4)
      • 🐳Docker (15)
      • 🪢laC (0)
      • ⚓K8s (7)
      • 🐧Linux (25)
      • 🖥️Monitoring (10)
        • Grafana (1)
        • Prometheus (6)
        • Loki (1)
        • ELK (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    alertmanager
    mariadb
    알리바바 클라우드
    db
    docker
    Cloud
    linux
    AWS
    Alibaba
    MySQL
    alb
    k8s
    mongoDB
    NGINX
    prometheus
    centOS7
    PolarDB
    jenkins
    SSL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Diven
DB 실행계획 차이: 원인 및 해결책
상단으로

티스토리툴바