Back to blog

Database Internals Roadmap: Database Hoạt Động Thế Nào Bên Trong

databasedatabase-internalsstorage-enginedistributed-systemsroadmap
Database Internals Roadmap: Database Hoạt Động Thế Nào Bên Trong

Bạn đã viết hàng ngàn câu SQL query. Bạn biết cách tạo index, tune slow query, và chọn database phù hợp cho project. Nhưng bạn có biết thực sự chuyện gì xảy ra khi chạy INSERT INTO không? Row đó đi đâu? Làm sao database đảm bảo nó không bị mất nếu mất điện giữa chừng?

Hầu hết developer coi database như một cái hộp đen. Bỏ data vào, lấy data ra. Cách đó ổn — cho đến khi nó không ổn nữa. Cho đến khi bạn đang debug một deadlock bí ẩn lúc 2 giờ sáng, thắc mắc tại sao index không được dùng, hoặc cố hiểu tại sao distributed system mất data dù có "ACID guarantee."

Series này mở toang cái hộp đen đó ra. Chúng ta sẽ khám phá cách database lưu data trên disk, quản lý memory, xử lý transaction, execute query, và coordinate giữa nhiều node. Đến cuối series, bạn sẽ không chỉ dùng database — mà hiểu nó.

Roadmap Này Dành Cho Ai?

Series này dành cho developer:

  • Có ít nhất 1–2 năm experience làm việc với relational database (PostgreSQL, MySQL, SQLite, v.v.)
  • Viết SQL thoải mái nhưng không biết chuyện gì xảy ra bên dưới query layer
  • Muốn hiểu tại sao một số query chậm, không chỉ cách fix
  • Đang chuẩn bị cho system design interview nơi database internals xuất hiện thường xuyên
  • Muốn đưa ra quyết định có cơ sở về database selection, schema design, và performance tuning
  • Tò mò về cách distributed database (CockroachDB, TiDB, Cassandra) đạt được consistency và availability

Bạn không cần bằng computer science — nhưng nên thoải mái với data structure cơ bản (array, hash map, tree) và đã dùng ít nhất một relational database trong project thực tế.

Bạn Sẽ Học Được Gì

Kết Quả Học Tập:
✅ Hiểu cách B-Tree và LSM-Tree lưu trữ và truy xuất data trên disk
✅ Giải thích cách buffer pool và page layout quản lý memory hiệu quả
✅ Mô tả cách Write-Ahead Logging (WAL) đảm bảo crash safety
✅ Xây dựng mental model cho ACID transaction và isolation level
✅ Phân tích query execution plan và hiểu quyết định của query optimizer
✅ So sánh các loại index (B+Tree, Hash, GIN, GiST) và chọn đúng loại
✅ Hiểu lock management, deadlock detection, và MVCC
✅ Suy luận về distributed storage: replication, partitioning, và consensus
✅ Đánh giá trade-off giữa các database architecture khác nhau
✅ Debug database performance issue một cách tự tin, không phải đoán mò

Yêu Cầu Trước Khi Bắt Đầu

  • Kỹ năng SQL vững (JOIN, subquery, transaction, index)
  • Quen thuộc với ít nhất một RDBMS (PostgreSQL được khuyến khích, nhưng MySQL/SQLite cũng được)
  • Hiểu biết cơ bản về data structure: array, linked list, hash map, binary tree
  • Thoải mái đọc pseudocode hoặc code example đơn giản (chúng ta sẽ dùng SQL, Python, và Go)
  • Kiến thức OS cơ bản có ích nhưng không bắt buộc (file, memory, process)

Tại Sao Database Internals Quan Trọng

Bạn có thể thắc mắc: "Mình là backend developer, không phải database engineer. Tại sao phải care về page layout và WAL?"

Đây là lý do:

1. Debug Performance Trở Nên Đơn Giản

Khi bạn hiểu rằng B+Tree index lưu key theo thứ tự sorted với leaf node liên kết nhau, bạn ngay lập tức biết tại sao ORDER BY trên indexed column nhanh và tại sao LIKE '%search%' không thể dùng index. Không còn cargo-cult output của EXPLAIN ANALYZE nữa.

2. Schema Design Có Chủ Đích

Biết cách storage engine tổ chức data nghĩa là bạn design table và index theo hướng engine, không ngược lại nó. Bạn sẽ hiểu tại sao wide row gây hại trong PostgreSQL nhưng ok trong Cassandra, và tại sao covering index loại bỏ table lookup.

3. System Design Interview Dễ Hơn

Câu hỏi database internals xuất hiện khắp nơi trong interview level senior: "Bạn sẽ design system xử lý 100K write/giây thế nào?" hoặc "Giải thích trade-off giữa strong và eventual consistency." Series này cho bạn mental model để trả lời tự tin.

4. Ngừng Mắc Sai Lầm Đắt Giá

Developer không hiểu transaction isolation level sẽ ship code với phantom read. Developer không hiểu WAL sẽ tắt fsync để tăng performance rồi mất data. Kiến thức về internals ngăn ngừa những sai lầm tốn kém này.

Kiến Trúc Của Một Database

Trước khi đi sâu vào từng chủ đề, hãy xem bức tranh toàn cảnh. Mọi relational database — PostgreSQL, MySQL, SQLite — đều có kiến trúc high-level tương tự:

Từ trên xuống dưới:

  1. Query Parser — Chuyển SQL text thành Abstract Syntax Tree (AST)
  2. Query Optimizer — Tìm cách execute query hiệu quả nhất (dùng index nào, thứ tự join, v.v.)
  3. Execution Engine — Thực sự chạy plan, fetch và transform data
  4. Concurrency Control — Quản lý nhiều transaction đồng thời không bị conflict
  5. Buffer Pool — Giữ disk page hay truy cập trong memory để tăng tốc
  6. Storage Engine — Tổ chức data trên disk bằng data structure như B-Tree hoặc LSM-Tree
  7. Disk Storage — Các file thực tế trên disk: data file, index file, và Write-Ahead Log

Series này đi qua từng layer, từ dưới lên (disk) đến trên cùng (query processing).

Lộ Trình Học

Series này được tổ chức thành 3 phase, tiến dần từ cách data sống trên disk qua transaction processing đến distributed system.

Phase 1: Storage Fundamentals (Tuần 1–3)

Mục tiêu: Hiểu cách database lưu trữ, truy xuất, và bảo vệ data trên disk.

Đây là nền tảng. Bạn sẽ học hai thiết kế storage engine chủ đạo (B-Tree và LSM-Tree), cách database tổ chức data thành page và quản lý chúng trong memory qua buffer pool, và cách Write-Ahead Logging đảm bảo data đã commit không bao giờ bị mất — kể cả khi crash.

Chủ đề bao gồm:

  • Cấu trúc B-Tree: root, internal, và leaf node
  • LSM-Tree: memtable, SSTable, và compaction strategy
  • Khi nào dùng B-Tree vs LSM-Tree (read-heavy vs write-heavy workload)
  • Page layout: slotted page, tuple header, và free space management
  • Buffer pool: page replacement policy (LRU, clock), dirty page flushing
  • Write-Ahead Logging: log structure, checkpointing, crash recovery (ARIES)
  • fsync, durability guarantee, và "torn page" problem

Bài viết trong phase này:

📖 Post 2: Storage Engine — B-Tree vs LSM-Tree & Cách Data Sống Trên Disk
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Hai cách tiếp cận cơ bản để lưu data trên disk và khi nào chọn cái nào.

🔗 Bắt đầu Post 2: Storage Engine →

📖 Post 3: Page Layout, Buffer Pool & Memory Management trong Database
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách database tổ chức data trong page và quản lý memory tối ưu.

🔗 Bắt đầu Post 3: Page Layout & Buffer Pool →

📖 Post 4: Write-Ahead Logging (WAL), Recovery & Crash Safety
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách database đảm bảo durability và recover từ crash mà không mất data.

🔗 Bắt đầu Post 4: WAL & Crash Recovery →

Phase 2: Transaction, Indexing & Query Processing (Tuần 4–7)

Mục tiêu: Nắm vững cách database đảm bảo correctness, tăng tốc query, và xử lý SQL hiệu quả.

Phase này cover "bộ não" của database — transaction giữ data consistent, index làm query nhanh, và query engine chuyển SQL thành execution plan. Bạn sẽ hiểu isolation level đủ sâu để chọn đúng loại cho workload, và bạn sẽ biết tại sao optimizer đôi khi bỏ qua cái index bạn tạo cẩn thận.

Chủ đề bao gồm:

  • ACID property trong practice (không chỉ lý thuyết)
  • Isolation level: Read Uncommitted → Read Committed → Repeatable Read → Serializable
  • MVCC (Multi-Version Concurrency Control) — cách PostgreSQL và MySQL implement snapshot isolation
  • B+Tree index: structure, range scan, và covering index
  • Hash index, GIN (cho full-text search), GiST (cho spatial data), và Bloom filter
  • Composite index, index-only scan, và partial index
  • Query parsing: SQL → AST → logical plan → physical plan
  • Join algorithm: nested loop, hash join, merge join
  • Cost-based optimization và statistics
  • Lock management: shared/exclusive lock, lock escalation, deadlock detection

Bài viết trong phase này:

📖 Post 5: Transaction Processing — ACID, Isolation Level & MVCC
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách database duy trì correctness giữa các concurrent transaction.

🔗 Bắt đầu Post 5: Transaction & MVCC →

📖 Post 6: Indexing Deep Dive — B+Tree, Hash, GIN, GiST & Bloom Filter
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách các loại index khác nhau hoạt động bên trong và khi nào dùng cái nào.

🔗 Bắt đầu Post 6: Indexing Deep Dive →

📖 Post 7: Query Processing — Parsing, Planning & Execution Pipeline
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Hành trình của SQL query từ text đến result, và cách optimizer đưa ra quyết định.

🔗 Bắt đầu Post 7: Query Processing →

📖 Post 8: Lock Management, Deadlock & Concurrency Control
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách database xử lý concurrent access và resolve conflict.

🔗 Bắt đầu Post 8: Lock & Concurrency →

Phase 3: Advanced Storage & Distributed System (Tuần 8–11)

Mục tiêu: Khám phá storage design nâng cao và cách database scale trên nhiều machine.

Phase cuối cùng đi vào vùng cutting edge. Bạn sẽ hiểu cách distributed database replicate data, partition nó giữa các node, và đạt consensus — những problem định nghĩa data infrastructure hiện đại. Bạn cũng sẽ khám phá log-structured storage chuyên sâu, column-oriented design cho analytics, và cuối cùng so sánh cách các database thực tế (PostgreSQL, MySQL, SQLite, RocksDB) implement các concept này khác nhau.

Chủ đề bao gồm:

  • Replication: leader-follower, multi-leader, leaderless
  • Partitioning: range-based, hash-based, và consistent hashing
  • Consensus protocol: Raft, Paxos (simplified)
  • CAP theorem và ý nghĩa thực tế
  • SSTable, compaction strategy (size-tiered, leveled), và write amplification
  • Column-oriented storage: column family, compression, và vectorized execution
  • Analytical database: OLAP khác OLTP thế nào ở storage level
  • So sánh architecture: PostgreSQL (heap + B-Tree), MySQL/InnoDB (clustered index), SQLite (single-file), RocksDB (LSM-Tree)

Bài viết trong phase này:

📖 Post 9: Distributed Storage — Replication, Partitioning & Consensus
Thời gian: 7–10 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách database scale trên nhiều machine mà vẫn giữ consistency.

🔗 Bắt đầu Post 9: Distributed Storage →

📖 Post 10: Log-Structured Storage — SSTable, Compaction & Leveled Merge
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Design đằng sau write-optimized storage engine được dùng bởi Cassandra, RocksDB, và LevelDB.

🔗 Bắt đầu Post 10: Log-Structured Storage →

📖 Post 11: Column-Oriented Storage, Compression & Analytical Database
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách analytical database lưu trữ và xử lý data khác với transactional database.

🔗 Bắt đầu Post 11: Column-Oriented Storage →

📖 Post 12: So Sánh Database Architecture — PostgreSQL, MySQL, SQLite & RocksDB
Thời gian: 5–7 ngày, 1–2 giờ mỗi ngày
Bạn sẽ học: Cách bốn database phổ biến implement các concept trong series này khác nhau.

🔗 Bắt đầu Post 12: So Sánh Architecture →

Tổng Quan Series

Các Concept Quan Trọng

Đây là những concept quan trọng nhất bạn sẽ gặp trong toàn bộ series:

Storage Layer

ConceptÝ Nghĩa
B-TreeCây tự cân bằng giữ data sorted — default index trong hầu hết RDBMS
LSM-TreeCấu trúc tối ưu write, buffer write trong memory rồi flush sorted run ra disk
PageĐơn vị I/O nhỏ nhất — thường 4KB hoặc 8KB — mà database đọc/ghi mỗi lần
Buffer PoolCache disk page trong memory — component quan trọng nhất cho performance
WALWrite-Ahead Log — mọi thay đổi được log trước khi apply, đảm bảo crash recovery

Transaction Layer

ConceptÝ Nghĩa
ACIDAtomicity, Consistency, Isolation, Durability — bốn guarantee của transaction
MVCCMulti-Version Concurrency Control — reader không block writer bằng cách giữ version cũ
Isolation LevelTrade-off giữa correctness và performance cho concurrent transaction
DeadlockHai transaction chờ lock của nhau — cần detection và resolution

Query Layer

ConceptÝ Nghĩa
Query PlanExecution strategy được optimizer chọn — xem qua EXPLAIN
Cost-Based OptimizerChọn plan có estimated cost thấp nhất dựa trên table statistics
Join AlgorithmNested loop, hash join, merge join — mỗi cái optimal cho data size khác nhau
Index Scan vs Seq ScanDùng index để tìm row vs đọc toàn bộ table

Distributed Layer

ConceptÝ Nghĩa
ReplicationCopy data giữa nhiều node để durability và read scalability
PartitioningChia data giữa các node để không machine nào chứa hết
ConsensusAgreement protocol (Raft, Paxos) đảm bảo mọi node đồng ý về thứ tự operation
CAP TheoremBạn chỉ có thể có tối đa 2 trong 3: Consistency, Availability, Partition tolerance

Tài Liệu Tham Khảo

Series này được thiết kế để self-contained, nhưng nếu muốn đi sâu hơn, đây là những reference tốt nhất:

Sách

SáchPhù Hợp Cho
Database Internals (Alex Petrov)Nguồn cảm hứng chính cho series này — toàn diện và hiện đại
Designing Data-Intensive Applications (Martin Kleppmann)Bức tranh lớn về distributed data system
PostgreSQL 14 Internals (Egor Rogov)Deep dive vào implementation cụ thể của PostgreSQL
Database System Concepts (Silberschatz et al.)Giáo trình — kỹ lưỡng nhưng dày đặc

Tài Liệu Online

  • PostgreSQL documentation — Một trong những database documentation tốt nhất từng được viết
  • Use The Index, Luke — Visual guide tuyệt vời về SQL indexing
  • CMU Database Group (YouTube) — Chuỗi bài giảng của Andy Pavlo về database system
  • PGAnalyze Blog — Practical PostgreSQL performance insight

Cách Tận Dụng Tối Đa Series Này

  1. Thực hành với database thật. Cài PostgreSQL local và chạy example query. Không gì bằng hands-on experience.

  2. Dùng EXPLAIN ANALYZE liên tục. Sau khi học về storage engine và index, mỗi query trở thành cơ hội luyện tập.

  3. Đọc bài theo thứ tự. Mỗi bài xây dựng trên concept từ bài trước. Bỏ qua storage fundamentals sẽ khiến transaction và query processing khó hiểu hơn.

  4. Đừng học thuộc — xây mental model. Mục tiêu không phải nhớ mọi chi tiết về B-Tree node splitting. Mà là phát triển trực giác: "Query này chậm vì nó đang sequential scan trên table lớn trong khi lẽ ra nên dùng index trên column X."

  5. Kết nối với công việc hàng ngày. Mỗi lần bạn viết query, tạo index, hay chọn isolation level, nghĩ về chuyện gì đang xảy ra bên dưới.

Tóm Tắt

Database là một trong những phần mềm ấn tượng nhất từng được xây dựng. Chúng giải quyết problem mà hầu hết application không bao giờ phải nghĩ tới: crash recovery, concurrent access, efficient disk I/O, và distributed consensus. Hiểu cách chúng hoạt động không chỉ giúp bạn dùng database tốt hơn — mà giúp bạn trở thành engineer giỏi hơn.

Series này đưa bạn từ physical layer (cách byte được tổ chức trên disk) qua logical layer (transaction, index, query) đến distributed layer (replication, partitioning, consensus). Đến cuối, bạn sẽ có mental model hoàn chỉnh về chuyện gì xảy ra giữa câu SELECT của bạn và data đến application.

Sự khác biệt giữa developer dùng database và developer hiểu database giống như sự khác biệt giữa lái xe và biết engine hoạt động thế nào. Cả hai đều đưa bạn đến nơi cần đến — nhưng chỉ một người có thể chẩn đoán problem khi có gì đó hỏng.

Mở nắp capô thôi.

Series: Database Internals Roadmap
Tiếp theo: Storage Engine: B-Tree vs LSM-Tree →

📬 Đăng ký nhận bản tin

Nhận những bài viết mới nhất qua email mỗi tuần. Không spam, hủy đăng ký bất cứ lúc nào.

Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất cứ lúc nào.

💬 Comments

Đăng nhập để bình luận

Chúng tôi sẽ không đăng bất cứ điều gì mà không có sự cho phép của bạn.