phucbui2it
Java SoftwareEngineer
Trang chủVề tôi
HomeBlogDisk I/O — Tại sao Database của bạn lại chậm?

Disk I/O — Tại sao Database của bạn lại chậm?

5 tháng 2, 2026•
#database#performance-tuning#backend
•129 views
Disk I/O — Tại sao Database của bạn lại chậm?

Trong thế giới của Java Software Engineer, chúng ta thường tranh cãi về việc dùng ArrayList hay LinkedList, hoặc tối ưu thuật toán từ $O(n^2)$ xuống $O(n \log n)$. Nhưng trong thế giới Database, kẻ thù lớn nhất không phải là CPU, mà là Disk I/O.

Dù bạn dùng SSD "xịn" đến đâu, việc đọc ghi dữ liệu lên đĩa vẫn chậm hơn hàng nghìn lần so với thao tác trên RAM. Hãy cùng mổ xẻ lý do tại sao.

1. Công thức "Tử thần" của hiệu năng đĩa

Để hiểu tại sao DB chậm, ta cần nhìn vào chỉ số IOPS (Input/Output Operations Per Second). Dựa trên ghi chép từ Berkeley CS186 , công thức tính IOPS cho ổ đĩa cơ học (HDD) là:

  • Seek Time: Thời gian đầu đọc di chuyển đến đúng vòng tròn chứa dữ liệu.

  • Rotation Time: Thời gian chờ đĩa quay đến đúng vị trí sector cần đọc.

Đối với SSD, hai thông số này gần như bằng 0, đó là lý do SSD nhanh hơn đột biến. Tuy nhiên, công thức Throughput vẫn đúng cho cả hai loại:

2. Random I/O vs. Sequential I/O: Cuộc chiến sống còn

Đây là bí mật lớn nhất của Database Internals: Đọc/ghi tuần tự (Sequential) luôn nhanh hơn đọc/ghi ngẫu nhiên (Random).

  • Sequential I/O: Dữ liệu nằm liên tiếp nhau. Đầu đọc không phải nhảy đi nhảy lại. Throughput lúc này đạt cực đại vì $I/O\ size$ lớn.

  • Random I/O: Dữ liệu nằm rải rác. Mỗi lần đọc một mẩu nhỏ dữ liệu, hệ thống lại phải thực hiện một thao tác tìm kiếm mới. $I/O\ size$ lúc này xấp xỉ bằng 1, khiến hiệu năng thảm hại.

3. Database Page: Đơn vị vận chuyển của dữ liệu

Database không bao giờ đọc dữ liệu theo từng byte hay từng dòng lẻ tẻ. Nó quản lý dữ liệu dưới dạng các Pages (thường là 4KB, 8KB hoặc 16KB).

  • Mỗi tệp tin Database gồm nhiều Page.

  • Khi bạn cần tìm 1 record, DB phải load nguyên cả một Page chứa record đó từ đĩa lên Buffer Pool trong RAM.

  • Trade-off: Nếu Page quá lớn, bạn sẽ tốn I/O vô ích cho các dữ liệu không cần thiết. Nếu Page quá nhỏ, số lượng thao tác I/O sẽ tăng vọt.

4. Tại sao Inserts thường nhanh còn Updates lại chậm?

Dựa trên kiến thức từ khóa học CMU 15-445 và thực tế vận hành:

  • Inserts: Thường là ghi tuần tự vào cuối file (Heap file) hoặc Memtable, nên tận dụng được Sequential I/O.

  • Updates: Cực kỳ tốn kém vì involve Random Access. DB phải tìm vị trí chính xác của record cũ trên đĩa (thường thông qua B-Tree), đọc page đó lên, sửa đổi rồi ghi ngược lại.

DANH MỤC

SERIES

TỪ KHÓA

MỚI NHẤT

Built by PhucBui2. The source code is available on GitHub.

Database5Security4
The Database Internals5Mastering Modern OAuth3Modern Identity Architecture1
security7Database5database4backend3performance-tuning1spring1java1indexing1System Design1Backend1

Series: The Database Internals

Disk I/O — Tại sao Database của bạn lại chậm?
Part 1

Disk I/O — Tại sao Database của bạn lại chậm?

Đang đọc

Tại sao B-Tree lại là "Vua" của Index trong Database?
Part 2

Tại sao B-Tree lại là "Vua" của Index trong Database?

LSM-Tree – Cơ Chế Lưu Trữ Đằng Sau Sức Mạnh Ghi Dữ Liệu Của NoSQL
Part 3

LSM-Tree – Cơ Chế Lưu Trữ Đằng Sau Sức Mạnh Ghi Dữ Liệu Của NoSQL

[Series] Database Internals - Bài 1: Tại sao RDBMS lưu dữ liệu khác với File thông thường?
Part 4

[Series] Database Internals - Bài 1: Tại sao RDBMS lưu dữ liệu khác với File thông thường?

[Series] Database Internals - Bài 2: Giải mã "Thùng sách" – Nghệ thuật sắp xếp Slotted Page Layout
Part 5

[Series] Database Internals - Bài 2: Giải mã "Thùng sách" – Nghệ thuật sắp xếp Slotted Page Layout

01

[OAuth] Bài 2: Khóa chặt Access Token với DPoP và Refresh Token Rotation

1/3/2026
02

[OAuth] Bài 1: Khai tử Implicit Grant & Kỷ nguyên bắt buộc của PKCE

1/3/2026
03

[OAuth] Bài 0: Vì sao những kiến thức bảo mật bạn biết có thể đã lỗi thời?

1/3/2026
04

[Series] Database Internals - Bài 2: Giải mã "Thùng sách" – Nghệ thuật sắp xếp Slotted Page Layout

24/2/2026
05

[Series] Database Internals - Bài 1: Tại sao RDBMS lưu dữ liệu khác với File thông thường?

23/2/2026