Chủ Nhật, 28 tháng 6, 2026

Pagination là gì? (Phân trang kiểu Shopee, Facebook và Google hoạt động như thế nào?)

Vào nhà sách, bạn sẽ thấy khu vực sách Khoa Học Kỹ Thuật riêng, khu  vực Tiểu thuyết riêng, khu vực sách cho Thiếu nhi riêng...Sẽ ra sao nếu bạn muốn tìm một quyển sách trong hàng chục ngàn quyển sách mà mọi thứ không được phân chia theo từng khu vực riêng?

Bạn vừa tạo website bán hàng đầu tiên.

Database có:

15 sản phẩm.

Mọi thứ đều ổn.

😎


Một năm sau.

Website có:

15.000 sản phẩm.

Bạn viết:

SELECT *
FROM products;

MySQL:

"Được thôi."

😄


Rồi gửi về:

15.000 dòng.

💀


Trình duyệt bắt đầu thở dốc.

PHP bắt đầu nóng máy.

User thì...

"Thôi để mai quay lại."

😭


Pagination là gì?

Pagination (phân trang) là kỹ thuật chia dữ liệu thành nhiều trang nhỏ thay vì hiển thị tất cả cùng lúc.

Ví dụ:

Trang 1
Trang 2
Trang 3
...

Pagination giúp:

✅ Website tải nhanh hơn.

✅ Người dùng dễ tìm kiếm hơn.

✅ Giảm tải cho database.


Ví dụ đời thường 🍜

Bạn vào siêu thị.

Có:

20.000 sản phẩm.

Nếu nhân viên mang hết ra trước mặt bạn.

🤡

Bạn sẽ:

"Thôi khỏi mua."

😅


Thông minh hơn là chia thành từng kệ:

🥤 Nước uống

🍜 Mì

🍪 Bánh

🥛 Sữa


Pagination cũng làm điều tương tự.


Google hoạt động thế nào?

Bạn tìm:

PHP Tutorial

Google không trả:

50 triệu kết quả

một lúc.

😄


Mà chia:

Trang 1

Trang 2

Trang 3

Đó chính là Pagination.


Shopee cũng vậy

Bạn tìm:

Tai nghe Bluetooth

Shopee không hiển thị:

120.000 sản phẩm

trên một trang.


Họ chia:

60 sản phẩm

rồi sang trang tiếp theo.

😎


Facebook thì sao?

Facebook không có nút:

Trang 2

Nhưng thực chất vẫn là:

Pagination

Chỉ khác là:

Infinite Scroll

(Kéo tới đâu tải thêm tới đó.)


Về bản chất.

Facebook vẫn lấy dữ liệu theo từng đợt.


Pagination hoạt động ra sao?

Ví dụ mỗi trang:

10 bài viết.

Trang đầu:

SELECT *
FROM posts
ORDER BY id DESC
LIMIT 10;

Trang thứ hai:

SELECT *
FROM posts
ORDER BY id DESC
LIMIT 10 OFFSET 10;

Trang thứ ba:

SELECT *
FROM posts
ORDER BY id DESC
LIMIT 10 OFFSET 20;

Đơn giản vậy thôi.

😄


OFFSET là gì?

OFFSET nghĩa là:

Bỏ qua

Ví dụ:

LIMIT 10 OFFSET 20

Nghĩa là:

👉 Bỏ qua:

20 dòng đầu.

Sau đó lấy:

10 dòng tiếp theo.

😎


Ví dụ trực quan

Database có:

100 bài viết.

Trang:

1

Lấy:

1 → 10

Trang:

2

Lấy:

11 → 20

Trang:

3

Lấy:

21 → 30

Rất dễ hiểu.

😄


Công thức tính OFFSET

Nếu:

Mỗi trang = 10 bài.

Trang:

1

OFFSET:

0

Trang:

2

OFFSET:

10

Trang:

3

OFFSET:

20

Công thức:

OFFSET =

(Page - 1)

×

LIMIT

😎


Code PHP đơn giản

$page = $_GET['page'] ?? 1;

$limit = 10;

$offset = ($page - 1) * $limit;

$sql = "
SELECT *
FROM posts
ORDER BY id DESC
LIMIT $limit
OFFSET $offset
";

Đây là cách rất nhiều website PHP hoạt động.


Một hiểu lầm rất phổ biến 🤡

Người mới viết:

SELECT *
FROM posts;

Sau đó trong PHP:

Hiển thị 10 bài.

Website nhìn vẫn đúng.


Nhưng database đã gửi:

10.000 bài.

rồi.

😭


Pagination phải được xử lý ngay trong SQL.


InfinityFree Case 😅

Website mới.

Có:

30 bài viết.

Không sao.


Sau này có:

3.000 bài.

Nếu vẫn:

SELECT *
FROM posts;

Website sẽ:

🐌


Chỉ cần dùng:

LIMIT
OFFSET

là khác ngay.

😎


Một sự thật thú vị 😄

Google từng hiển thị:

1

2

3

4

5

ở cuối trang.


Ngày nay.

Nhiều website chuyển sang:

Load More

hoặc:

Infinite Scroll

Nhưng bên dưới.

Họ vẫn dùng:

Pagination.

Chỉ thay đổi cách hiển thị.


Debug kiểu dev thật 😎

✅ 1. Kiểm tra LIMIT

Đừng để thiếu.


✅ 2. Kiểm tra OFFSET

Sai OFFSET.

Trang nào cũng giống nhau.

🤡


✅ 3. Test:

?page=1

?page=2

?page=3

Xem dữ liệu có thay đổi không.


✅ 4. Luôn ORDER BY

Không ORDER BY.

Trang 1 hôm nay.

Có thể khác ngày mai.

😅


Checklist chuẩn không cần chỉnh 😎

☑ Dùng LIMIT

☑ Dùng OFFSET

☑ Luôn ORDER BY

☑ Test nhiều trang

☑ Không SELECT *

☑ Kiểm tra số trang cuối


FAQ nhanh

Pagination có làm website nhanh hơn không?

→ Trong đa số trường hợp:

Có. 😎


Facebook có Pagination không?

→ Có.

Nhưng dùng:

Infinite Scroll.

Google dùng Pagination không?

→ Có.


OFFSET tính thế nào?

(Page − 1)

×

LIMIT

Bạn có thể cũng đang gặp 😭

👉 LIMIT trong MySQL là gì?

👉 JOIN là gì?

👉 AUTO_INCREMENT hoạt động ra sao?

👉 Database chạy chậm dần?

👉 Backup database đúng cách?

👉 SQL Injection là gì?


Tổng kết

Pagination không phải là một "chiêu trò" của PHP hay MySQL.

Nó là cách gần như mọi website lớn trên Internet quản lý dữ liệu.

Nếu không có Pagination.

Google sẽ phải đưa cho bạn:

50 triệu kết quả

chỉ sau một lần tìm kiếm.

😱

Shopee sẽ phải tải:

200.000 sản phẩm.

Facebook sẽ cố hiển thị:

Toàn bộ bài viết từ năm bạn lập tài khoản.

🤡

May mắn là họ không làm vậy.

Họ chia dữ liệu thành từng phần nhỏ.

Website nhanh hơn.

Database khỏe hơn.

Người dùng cũng đỡ... hoảng hơn.

😄

Và nếu bạn chỉ nhớ một điều từ bài này, hãy nhớ:

Đừng bắt database bê cả kho hàng chỉ vì người dùng muốn xem 10 món đầu tiên.

Hãy để LIMITOFFSET làm việc đó giúp bạn.

Cả server lẫn người dùng sẽ cảm ơn bạn. 🚀