[Index-5][Optimization] 실전 분석 (1) - 실행 계획의 이해

2025. 12. 23. 21:24·Database/MySQL

1. 들어가며

 인덱스의 원리와 유형을 학습하는 것만으로 모든 성능 문제가 해결되지는 않는다. 인덱스는 데이터를 효율적으로 찾기 위한 도구일 뿐이며, 이 도구를 실질적으로 어떻게 활용할지 결정하는 상위 개념인 쿼리 실행 계획을 이해해야 한다. 이를 위해 먼저 MySQL의 내부 구조를 살펴본다.


2. MySQL의 내부 구조 

 

 MySQL 시스템 내부에는 크게 옵티마이저(Optimizer)와 스토리지 엔진(Storage Engine, InnoDB)이 존재한다. 이들의 관계를 도서관에 비유하면 다음과 같다.

  • 옵티마이저(사서): 도서관의 사서와 같은 역할을 수행한다. 특정 책이 어느 서가에 있는지, 그리고 그 책을 찾는 가장 빠른 경로가 어디인지 안내하는 지휘 통제실이다.
  • 스토리지 엔진(서가): 실제 데이터가 저장된 물리적인 장소이다. 도서관의 책장 그 자체를 의미하며, 옵티마이저가 수립한 계획에 따라 실제 데이터를 읽어오는 역할을 담당한다.

 SQL 쿼리가 외부에서 입력되면 옵티마이저는 고민을 시작한다. "이 데이터를 어떻게 가져와야 가장 효율적일까?"라는 질문에 대한 답을 찾는 과정이다. 동일한 데이터라 하더라도 아래에 있는 방법들(PK 순서로 정렬된 서가를 뒤질 것인지, 특정 카테고리로 묶인 인덱스 카탈로그를 활용할 것인지)에 따라 성능 차이가 극명하기 때문이다.


3. 옵티마이저의 판단 근거: 통계 데이터 

 옵티마이저가 경로를 결정할 때 가장 중요하게 고려하는 요소는 데이터의 특성이다. 가져와야 할 데이터의 양이 어느 정도인지, 데이터의 분포는 어떠한지에 따라 최적의 방식이 달라지기 때문이다. 옵티마이저는 이를 판단하기 위해 내부적으로 축적된 통계 데이터를 활용한다.

 

 관리자가 매번 통계치를 갱신하지 않아도 MySQL은 자체적으로 인덱스의 크기, 테이블의 행(Row) 수, 컬럼별 통계 정보를 내부 테이블(예: information_schema 등)에 저장해 둔다. 옵티마이저는 이러한 수치들을 기반으로 각 경로의 비용(Cost)을 계산하며, 이를 바탕으로 세운 최적의 경로를 바로 쿼리 실행 계획(Query Plan)이라 부른다.

 


4. 쿼리 실행 계획(Query Plan)의 의미와 역할

 쿼리 실행 계획이란 DBMS가 SQL 쿼리를 처리하기 위해 수립한 일종의 '지도'이다. 이는 데이터를 검색하고 추출하는 구체적인 순서와 방식을 결정한다. 옵티마이저는 가능한 여러 플랜 중 리소스(CPU, 메모리, I/O)를 최소한으로 사용하는 최적의 플랜을 선택한다. 계획이 결정되면 스토리지 엔진에 명령을 전달하고, 비로소 실제 데이터 추출이 이루어진다. 즉, 사용자는 요청을 보내고, 옵티마이저는 길을 찾으며, 스토리지 엔진은 그 길을 걸어가는 구조인 것이다.

 


5. 부적절한 실행 계획과 개발자의 역할

 옵티마이저는 대체로 영리한 선택을 내리지만, 때로는 개발자의 의도와 다른 비효율적인 경로를 선택하기도 한다. 이는 주로 옵티마이저가 참고할 인덱스가 부족하거나, 통계 정보가 실제 데이터와 동기화되지 않았을 때 발생한다.

 

 이러한 상황에서 개발자는 옵티마이저가 더 나은 선택을 할 수 있도록 '길'을 열어주어야 한다. 실행 계획을 분석하여 병목 지점을 파악하고, 그에 맞는 새로운 인덱스를 생성하면 옵티마이저는 이를 새로운 선택지로 인지하여 실행 계획을 자동으로 수정한다. 결과적으로 구린 선택지 대신 효율적인 경로를 타게 됨으로써 데이터베이스의 성능이 향상되는 것이다.

'Database > MySQL' 카테고리의 다른 글

[Index-7][Optimization] 실무 적용(⭐) - 복합 인덱스/집계 테이블/반정규화  (0) 2025.12.24
[Index-6][Optimization] 실전 분석 (2) - 실행 계획 타입(Type)  (0) 2025.12.24
[Index-4][Optimization] 심화 이론 (2) - 물리적 저장 구조  (0) 2025.12.23
[Index-3][Optimization] 심화 이론 (1) - B-Tree와 B+Tree  (0) 2025.12.23
[Index-2][Optimization]인덱스 설계와 카디널리티 전략  (0) 2025.12.23
'Database/MySQL' 카테고리의 다른 글
  • [Index-7][Optimization] 실무 적용(⭐) - 복합 인덱스/집계 테이블/반정규화
  • [Index-6][Optimization] 실전 분석 (2) - 실행 계획 타입(Type)
  • [Index-4][Optimization] 심화 이론 (2) - 물리적 저장 구조
  • [Index-3][Optimization] 심화 이론 (1) - B-Tree와 B+Tree
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (250) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (25) N
        • MSA 기본 (11)
        • MSA 아키텍처 (14) N
      • Kafka (30) N
        • Core (18) N
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

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

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[Index-5][Optimization] 실전 분석 (1) - 실행 계획의 이해
상단으로

티스토리툴바