Engine Atlas

Secondary index에서 clustered row까지

secondary index · clustered row · Buffer Pool
mysql 8.4.10captured evidence
English
학습 안내

이 Lab에서 답할 질문

non-covering secondary index range에서 어떤 entry가 읽히고 carried primary key가 어느 clustered row lookup으로 이어지나요?

실행 엔진: mysql 8.4.10
누가 실행하나요?

하나의 Session이 같은 SELECT를 cold-page와 warm-page capture variant에서 실행합니다.

무엇을 고정하나요?

동일한 secondary index entries, selected primary keys, clustered rows와 반환 checksum을 사용합니다.

실행 SQL
SELECT id, customer_id, status, ordered_at, total_cents
FROM orders
WHERE customer_id = 412
  AND status = 'PAID'
  AND ordered_at >= '2025-01-01 00:00:00'
ORDER BY ordered_at DESC, id DESC
LIMIT 20;
무엇이 달라지나요?

variant별 captured page-state snapshot과 counter delta가 달라지며 화면의 강조 page가 바뀝니다.

무엇이 그대로인가요?

secondary index → primary key → clustered row의 논리 lookup과 최종 결과 rows는 동일합니다.

먼저 예측해 보세요

index가 total_cents를 포함하지 않는다면 다음 단계는 무엇일까요?

index가 total_cents를 포함하지 않는다면 다음 단계는 무엇일까요?

증거 미션

cold variant의 carried primary key 단계를 열어 secondary entry가 어떤 primary key를 들고 있고 그것이 왜 필요한지 확인하세요.

어디를 보나요?
Index/row 상세에서 carried primary key를, Buffer Pool evidence에서 page-state와 counter를 함께 봅니다.
이동할 화면
Cold · carried primary key
무엇이 보여야 하나요?
확인할 관찰

idx_orders_customer_status_ordered_id의 explicit id key part가 primary key를 전달하고, SELECT의 total_cents는 entry에 없으므로 그 key가 PRIMARY lookup key가 됩니다. page-state와 counter는 Captured이고 secondary entry에서 clustered row로 가는 경로는 Model입니다.

근거 경계
Captured
cold variant의 page-state snapshot과 counter delta
Model
carried primary key로 clustered row를 찾는 논리 경로
Checkpoint · evidence로 설명하기cold와 warm 화면을 cache 적중 여부 또는 실제 physical I/O 순서로 설명해도 되나요?답과 근거 확인

안 됩니다. 화면은 captured page-state snapshot과 counter delta를 보여 줍니다. secondary entry에서 clustered row로 이어지는 것은 논리 model이며 실제 physical I/O 순서를 재현하지 않습니다.

근거 경계
Captured
page-state snapshot과 counter delta
Model
secondary entry에서 clustered row로 이어지는 논리 경로
이번 Lab의 핵심

non-covering index는 secondary entry에서 끝나지 않습니다. carried primary key와 base-row lookup을 구분하되 page state를 I/O trace로 과장하지 않아야 합니다.

다음 연결

다음 Lab에서는 같은 clustered row가 transaction snapshot에 따라 어느 row version으로 보이는지 MVCC 관점에서 이어서 봅니다.

용어 확인
base-row lookup처음 다루는 Lab 06
secondary index entry에 없는 column을 얻기 위해 carried primary key로 clustered record를 찾는 논리 단계입니다.
Buffer Pool처음 다루는 Lab 06
InnoDB가 index와 data page를 memory에 보관하고 재사용하는 cache 영역입니다.
B-tree처음 다루는 Lab 02
정렬된 key를 계층적으로 보관해 equality와 range 탐색을 지원하는 index 구조입니다.

01 · SOURCE

Exact SQL

5 active fragmentsMySQLrange · non-covering · ORDER BY · LIMIT 20
SELECT id, customer_id, status, ordered_at, total_cents
FROM orders
WHERE customer_id = 412
  AND status = 'PAID'
  AND ordered_at >= '2025-01-01 00:00:00'
ORDER BY ordered_at DESC, id DESC
LIMIT 20;
  1. LimitLIMIT 20
  2. range scansecondary index
02 · FLOW

Native plan과 actual iterator

01 / 17
Active native excerpt2
limitTREE line 1

-> Limit: 20 row(s) (cost=14.2 rows=20)

index-range-scanTREE line 2

-> Index range scan on orders using idx_orders_customer_status_ordered_id over (customer_id = 412 AND status = 'PAID' AND ordered_at <= '2025-01-01 00:00:00'), with index condition: ((orders.`status` = 'PAID') and (orders.customer_id = 412) and (orders.ordered_at >= TIMESTAMP'2025-01-01 00:00:00')) (cost=14.2 rows=31)

DATA PATH

Index entry에서 clustered row까지

Model
WHERE range

Matching secondary entries

Derived · fixture
customer_idstatusordered_atid · primary key
412PAID2026-06-24 23:20:00130460
412PAID2026-06-17 20:40:00129436
412PAID2026-05-20 10:00:00125340

31 total · 28 개 entry 생략

clustered lookup에 전달되는 primary key130460
total_cents absent from secondary entry
PRIMARY

Exact clustered row

Derived · fixture
id
130460
customer_id
412
status
PAID
ordered_at
2026-06-24 23:20:00
total_cents
113740

ORDER BY와 LIMIT 20 결과

Captured
idcustomer_idstatusordered_attotal_cents
130460412PAID2026-06-24 23:20:00113740
129436412PAID2026-06-17 20:40:004684
125340412PAID2026-05-20 10:00:0068460
124316412PAID2026-05-13 07:20:00209404
120220412PAID2026-04-14 20:40:0023180
119196412PAID2026-04-07 18:00:00164124
115100412PAID2026-03-10 07:20:00227900
114076412PAID2026-03-03 04:40:00118844
109980412PAID2026-02-02 18:00:00182620
108956412PAID2026-01-26 15:20:0073564
104860412PAID2025-12-29 04:40:00137340
103836412PAID2025-12-22 02:00:0028284
99740412PAID2025-11-23 15:20:0092060
98716412PAID2025-11-16 12:40:00233004
94620412PAID2025-10-19 02:00:0046780
93596412PAID2025-10-11 23:20:00187724
89500412PAID2025-09-13 12:40:001500
88476412PAID2025-09-06 10:00:00142444
84380412PAID2025-08-08 23:20:00206220
83356412PAID2025-08-01 20:40:0097164
sha256 · f3b6a116a0d644412cd60167a96e4e8d628adbe75106f53d78c3893fef401a8b
01 / 17