1. Mối Quan Hệ Giữa Page và Row Trong InnoDB
1.1. Khái Niệm Về Page
Pagelà đơn vị lưu trữ cơ bản trong cơ sở dữ liệu InnoDB của MySQL.- Mỗi
pagecó kích thước cố định; tất cả dữ liệu của bảng được lưu trữ trong cácpage. - Kích thước
pagemặc định trong InnoDB là16KB, nhưng có thể điều chỉnh thành4KB,8KB,32KBhoặc64KBtùy theo nhu cầu sử dụng.
1.2. Khái Niệm Về Row
- Mỗi
tabletrong MySQL bao gồm nhiềurow, và mỗirowđược lưu trữ trong một hoặc nhiềupage. - Một
pagecó thể chứa nhiềurowkhác nhau.
Lưu ý Quan Trọng:
- MySQL thực hiện thao tác trên
pagethay vìrow, nghĩa là khi thực hiện câu lệnh chọn dữ liệu, MySQL sẽ truy xuất toàn bộ cácpagechứa cácrowcần thiết để xử lý. - Đối với các kích thước
pagekhác nhau (như 4KB, 8KB, 16KB,...), InnoDB quy định rằng độ dài tối đa của mỗirowsẽ không quá 1/2 kích thước củapage. Cụ thể:- Với
page16KB, độ dài tối đa của mộtrowlà khoảng 8KB. - Với
page64KB, độ dài tối đa của mộtrowlà gần 16KB.
- Với
Tóm lại: Hãy tưởng tượng
pagenhư một tờ giấy A4, trong khirowlà các dòng dữ liệu trên tờ giấy đó. Độ dài của cácrowkhông vượt quá một nửa kích thước củapagenhằm tối ưu hóa hiệu suất lưu trữ và truy xuất dữ liệu.
Ví Dụ Cụ Thể
Giả sử bạn có một bảng có cấu trúc như sau:
CREATE TABLE employee (
id INT,
name VARCHAR(255),
address VARCHAR(255),
description TEXT
);
- Nếu kích thước
pagelà 16KB và mỗirowcủa bảngemployeecó dung lượng xấp xỉ 8KB, mỗipagecó thể chứa được 2rows. - Nếu kích thước
pagelà 64KB, mộtpagecó thể chứa khoảng 4rows(vì mỗirowcó dung lượng tối đa 16KB).
Việc giới hạn kích thước của mỗi row (tối đa 1/2 kích thước của page) không chỉ giúp tiết kiệm diện tích lưu trữ mà còn cải thiện hiệu suất khi thực hiện các thao tác trên cơ sở dữ liệu.
2. Khi Dữ Liệu Row Vượt Quá Dung Lượng Tối Đa
Khi một row vượt quá kích thước tối đa cho phép, các cột dạng VARCHAR, VARBINARY, BLOB hoặc TEXT sẽ được chuyển sang lưu trữ bên ngoài page (hay còn gọi là off-page storage).
Có hai loại định dạng off-page storage: COMPACT/REDUNDANT và DYNAMIC/COMPRESSED.
2.1. Định Dạng COMPACT / REDUNDANT
InnoDB sẽ lưu trữ một phần dữ liệu của cột dạng biến độ dài trong page chính và phần còn lại trong các overflow pages.
- Cụ thể:
- InnoDB lưu 768 byte đầu tiên của cột ngay trong
rowtrênpagechính. - Nếu dữ liệu của cột dài hơn 768 byte, phần còn lại sẽ nằm trong các
overflow pages. Ví dụ, nếu cột có dung lượng 1500 byte, 768 byte sẽ ởpagechính, và 732 byte còn lại sẽ ởoverflow pages. - Phía trước 768 byte, có thêm 20 byte để lưu trữ độ dài thực tế của cột và con trỏ trỏ đến danh sách các
overflow pages.
- InnoDB lưu 768 byte đầu tiên của cột ngay trong
Tóm tắt: Trong định dạng COMPACT và REDUNDANT, 768 byte đầu tiên của cột được lưu tạm trong row trên page chính, trong khi phần còn lại sẽ được lưu bên ngoài page.
2.2. Định Dạng DYNAMIC / COMPRESSED
Khi một cột với độ dài thay đổi cần lưu trữ ngoài page, InnoDB không lưu 768 byte đầu tiên ở page chính như ở định dạng COMPACT/REDUNDANT.
- Cụ thể:
- Toàn bộ dữ liệu sẽ được chuyển ngay đến các
overflow pagesngay từ đầu. - Chỉ có một con trỏ 20 byte được lưu trên
pagechính để trỏ đến vị trí của cácoverflow pageschứa dữ liệu của cột.
- Toàn bộ dữ liệu sẽ được chuyển ngay đến các
Tóm tắt: Trong định dạng DYNAMIC và COMPRESSED, chỉ có con trỏ 20 byte được lưu trên page chính, trong khi toàn bộ dữ liệu của cột được để ở overflow pages, giúp tiết kiệm không gian trên page chính.
| Đặc điểm | COMPACT / REDUNDANT | DYNAMIC / COMPRESSED |
|---|---|---|
| Phần dữ liệu trên page chính | 768 byte đầu tiên + 20 byte pointer | Chỉ có 20 byte pointer |
| Dữ liệu ngoài page | Phần còn lại sau 768 byte đầu | Toàn bộ dữ liệu cột |
| Ưu điểm | Tốc độ truy cập nhanh với dữ liệu nhỏ | Tiết kiệm không gian, hiệu quả với cột dữ liệu lớn |
| Nhược điểm | Tốn nhiều không gian page chính | Có thể làm giảm tốc độ truy cập dữ liệu |
Khi Nào Nên Sử Dụng Loại Nào?
- COMPACT/REDUNDANT: Phù hợp khi dữ liệu của cột thường không lớn (dưới 768 byte), vì định dạng này hỗ trợ lưu trữ 768 byte đầu tiên trong
pagechính, giúp dễ dàng truy cập hơn. - DYNAMIC/COMPRESSED: Phù hợp với các bảng có nhiều cột lớn, vì toàn bộ dữ liệu được lưu bên ngoài
page, giúp tiết kiệm không gian và tăng khả năng chứarowtrong mộtpage.
Kết Luận
Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về mối quan hệ giữa page và row trong InnoDB. Để nhận thêm nhiều bài viết thú vị khác, hãy kết nối với tôi qua các trang mạng xã hội:
- Youtube: https://www.youtube.com/@pdthien
- LinkedIn: www.linkedin.com/in/pdthien
Tài Liệu Tham Khảo
- Nguyên lý 3+2 hiệu quả cho mọi database - anh Trần Quốc Huy
- Tài liệu resmi của MySQL
source: viblo