SQL 한 문장이 InnoDB 페이지를 만날 때까지
서버 경계, 연결과 메모리, 쿼리 처리, 저장 구조를 하나의 요청 흐름으로 연결합니다.
오늘 따라갈 네 개의 경계
연결
Client 요청이 Connection을 만들고 Session 상태와 실행 단위를 얻습니다.
SQL 처리
Parser, Resolver/Preparation, Optimizer, Executor가 문장을 계획으로 바꿉니다.
엔진 경계
Executor가 Handler API를 통해 InnoDB에 행과 인덱스 접근을 요청합니다.
저장 구조
Buffer Pool, Tablespace, Page, Clustered Index가 실제 I/O를 결정합니다.
MySQL 서버와 InnoDB의 역할 경계
실행 계획은 서버가 만들고, 실제 레코드·인덱스·페이지 접근은 스토리지 엔진이 수행합니다.
Plugin Storage Engine 구조
InnoDB
트랜잭션 · 행 잠금 · 외래 키 · crash recovery
MyISAM
비트랜잭션 · 테이블 잠금 · 외래 키 미지원
MEMORY
메모리 기반 · 재시작 시 데이터 소멸 · 임시성
Client → Connection → Session → Thread
Client
애플리케이션이나 CLI가 Connector로 접속을 시도합니다.
TCP/IP · Unix socketConnection
인증된 통신 채널입니다. 요청과 결과가 이 채널을 오갑니다.
connection_idSession
세션 변수, 문자 집합, 트랜잭션 상태 같은 논리 문맥입니다.
@@session.*Thread
기본 모델에서 연결 요청을 처리하는 실행 단위입니다.
one-thread-per-connectionGlobal Memory vs Session Memory
Global / Shared
여러 연결이 함께 쓰는 InnoDB 페이지 캐시입니다. 테이블 캐시와 Performance Schema 메모리도 서버 범위에서 관리됩니다.
SQL Query 처리 흐름
Parser
문법을 확인하고 SQL을 내부 트리로 만듭니다.
Resolver / Preparation
테이블·열·권한·의미를 해석합니다. 흔히 Preprocessor로 묶어 설명합니다.
Optimizer
통계와 비용으로 접근 방법과 조인 순서를 선택합니다.
Executor
계획을 순회하고 Handler API로 엔진에 행을 요청합니다.
Storage Engine
인덱스·레코드·페이지를 읽거나 바꾸고 결과를 돌려줍니다.
Parser와 Resolver/Preparation
Parser
▲ syntax error
- 토큰과 문법 규칙 확인
- SQL을 내부 트리로 구성
- 옵티마이저 힌트 인식
Resolver / Preparation
▲ unknown column
- 테이블·열·별칭·뷰 참조 해석
- 권한과 의미 조건 확인
- 교육 자료의 Preprocessor 범주에 해당
Optimizer가 고르는 실행 계획
FROM orders o
JOIN customers c
ON c.id = o.customer_id
WHERE o.status = 'PAID';
Full scan
orders 전체를 읽고 조건을 적용합니다.
- 선택도가 낮은 조건
- 테이블 통계와 예상 행 수
Index + join
status 인덱스로 후보를 줄이고 PK로 customers를 찾습니다.
- 사용 가능한 인덱스
- 조인 순서와 랜덤 I/O
Hash join
조건과 버전에 따라 해시 기반 조인도 후보가 됩니다.
- 조인 입력의 예상 크기
- 메모리와 빌드 비용
Executor와 Storage Engine의 핸드셰이크
Executor
- 실행 계획의 iterator를 순회
- WHERE·JOIN·정렬·집계 흐름 제어
- 필요한 행 연산을 Handler에 요청
API
InnoDB
- 인덱스 탐색과 레코드 읽기
- Buffer Pool에서 페이지 확인
- 필요하면 Tablespace I/O 수행

InnoDB Architecture
In-Memory
Buffer Pool, Change Buffer, Log Buffer가 데이터와 변경을 다룹니다. Adaptive Hash Index는 반복되는 B-tree 접근을 관찰해 hot path에 hash lookup을 보조하며 효과는 workload에 따라 달라집니다.
On-Disk
Tablespace, Redo Log, Doublewrite 파일 등이 데이터 영속성과 복구를 받칩니다.

Buffer Pool에서 읽고 쓰기
Page lookup
필요한 데이터·인덱스 페이지가 Buffer Pool에 있는지 확인합니다.
Miss → read
없으면 Tablespace에서 페이지를 읽어 캐시에 올립니다.
Dirty page
수정된 페이지는 메모리에 남고 백그라운드에서 디스크로 flush됩니다.
LRU variant
midpoint insertion으로 큰 스캔이 자주 쓰는 페이지를 모두 밀어내지 않도록 조절합니다.
Tablespace 지형도
Tablespace = pages를 담는 논리 공간
data + indexes
file-per-table은 한 테이블의 데이터와 인덱스를 하나의 .ibd 테이블스페이스 파일에 둡니다.
System
공유 내부 구조·시스템 데이터
File-per-table
테이블별 독립 .ibd, MySQL 8.0 기본 배치
General
여러 테이블을 담는 사용자 생성 공유 공간
Undo
최근 변경을 되돌리는 undo log 저장
Temporary
세션·글로벌 임시 데이터 저장
주의
Tablespace와 OS 파일은 항상 1:1이 아닙니다.

Page → Extent → Segment
Primary Key Clustering · Foreign Key
PRIMARY KEY
명시한 PK를 clustered index로 사용합니다.
UNIQUE NOT NULL
PK가 없으면 조건을 만족하는 첫 unique index를 사용합니다.
GEN_CLUST_INDEX
둘 다 없으면 6-byte 숨은 row ID 기반 인덱스를 만듭니다.
Secondary Index의 두 번째 탐색
Secondary B-tree
보조 키와 함께 해당 행의 Primary Key 열을 저장합니다.
Clustered B-tree
전체 행이 필요하면 PK로 clustered index를 다시 탐색합니다.
Stored Object 용어 지도
Stored Object
서버에 SQL 정의를 저장해 나중에 실행하거나 참조하는 객체의 상위 범주
Stored Program
실행되는 서버 객체의 묶음
View
참조할 때 결과 집합을 만드는 가상 테이블. 이번 발표의 상세 범위에서는 제외합니다.
Procedure · Function · Trigger · Event
Stored Program 선택 체크리스트

SELECT 한 문장의 End-to-End 경로
세 가지 렌즈로 MySQL을 읽는다
어느 계층인가
MySQL 서버의 공통 SQL 계층과 InnoDB의 데이터 접근 책임을 먼저 나눕니다.
어떤 계획인가
옵티마이저가 선택한 접근 방법과 실행기의 실제 흐름을 EXPLAIN으로 확인합니다.
어떤 페이지인가
Buffer Pool hit/miss, Tablespace, Clustered Index가 만든 I/O 비용을 추적합니다.