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 TutorialGoogle 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 BluetoothShopee không hiển thị:
120.000 sản phẩmtrê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 2Nhưng thực chất vẫn là:
PaginationChỉ 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ỏ quaVí dụ:
LIMIT 10 OFFSET 20Nghĩ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 → 10Trang:
2↓
Lấy:
11 → 20Trang:
3↓
Lấy:
21 → 30Rất dễ hiểu.
😄
Công thức tính OFFSET
Nếu:
Mỗi trang = 10 bài.Trang:
1OFFSET:
0Trang:
2OFFSET:
10Trang:
3OFFSET:
20Cô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
OFFSETlà 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 Morehoặc:
Infinite ScrollNhư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=3Xem 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)
×
LIMITBạ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 để
LIMITvàOFFSETlàm việc đó giúp bạn.Cả server lẫn người dùng sẽ cảm ơn bạn. 🚀