하나의 Session이 같은 SELECT를 baseline과 indexed variant에서 각각 실행합니다.
Order Search Execution
같은 SQL, 같은 데이터, 다른 access pathMySQL 8.4.102026-07-12
English학습 안내
이 Lab에서 답할 질문
같은 결과 20 rows를 반환하면서도 index가 실제로 읽기·filter·join·sort 작업량을 어디에서 줄이나요?
실행 엔진: MySQL 8.4.10
동일한 orders와 customers fixture, 동일한 predicate, ORDER BY, LIMIT 20을 사용합니다.
실행 SQL
SELECT
o.id,
o.ordered_at,
o.total_cents,
c.id AS customer_id,
c.name AS customer_name
FROM customers AS c
JOIN orders AS o
ON o.customer_id = c.id
WHERE c.country_code = 'KR'
AND o.status = 'PAID'
AND o.ordered_at >= '2025-01-01 00:00:00'
ORDER BY o.ordered_at DESC, o.id DESC
LIMIT 20;
table/index access path, 읽은 candidate rows, join lookup 횟수, sort에 들어간 rows가 달라집니다.
실행 SQL의 의미와 반환 20 rows의 checksum은 두 variant에서 그대로 유지됩니다.
index를 추가한 variant에서 가장 먼저 확인해야 할 결과는 무엇일까요?
indexed variant의 statement summary를 열어 반환 20 rows가 그대로인데 statement 작업량이 어떻게 줄었는지 확인하세요.
- 어디를 보나요?
- Plan & Evidence 패널의 statement metric에서 rows examined, sort rows, no-index-used flag를 함께 읽습니다.
- 이동할 화면
Indexed · statement summary
무엇이 보여야 하나요?
확인할 관찰
indexed statement는 rows examined 4,040과 sort rows 20, no-index-used 0을 기록합니다. baseline의 131,828과 31,348, flag 1과 비교되지만 두 variant의 result checksum efa5c8c2…는 같습니다.
근거 경계- Captured
- variant별 statement rows examined·sort rows·no-index-used flag
- Captured
- 두 variant가 공유하는 20-row result checksum
Checkpoint · evidence로 설명하기baseline의 31,348과 378은 각각 무엇을 세는 값인가요?답과 근거 확인
31,348은 captured statement의 sort rows이고, 378은 LIMIT 20을 채우기 위해 소비한 정렬 결과 prefix를 fixture로 재현한 값입니다. 둘은 같은 단계의 같은 단위가 아닙니다.
근거 경계- Captured
- statement의 31,348 sort rows
- Derived · fixture
- LIMIT 20을 채운 378-row prefix replay
index 효과는 결과가 달라지는 것이 아니라 같은 답을 만들기 위해 거치는 candidate·lookup·sort 경로가 달라지는 데서 확인해야 합니다.
다음 Lab에서는 composite index의 column order가 range 경계와 base-row lookup을 어떻게 바꾸는지 더 작은 단위로 분해합니다.
용어 확인
access path처음 다루는 Lab 01- 조건에 맞는 row를 찾기 위해 optimizer가 선택한 table scan, index range scan 같은 읽기 경로입니다.
filter처음 다루는 Lab 01- 읽어 온 candidate row에 WHERE predicate를 적용해 통과하는 row와 탈락하는 row를 나누는 단계입니다.
filesort처음 다루는 Lab 01- index order만으로 ORDER BY를 만족하지 못할 때 사용하는 MySQL의 별도 정렬 작업 이름이며, 반드시 disk file을 뜻하지는 않습니다.
01 · SOURCE
SQL
SELECT o.id, o.ordered_at, o.total_cents, c.id AS customer_id, c.name AS customer_name
FROM customers AS c
JOIN orders AS o ON o.customer_id = c.id
WHERE c.country_code = 'KR'
AND o.status = 'PAID'
AND o.ordered_at >= '2025-01-01 00:00:00'
ORDER BY o.ordered_at DESC, o.id DESC
LIMIT 20;02 · FLOW
01 / 13