Mệnh đề LIMIT trong MySQL dùng để giới hạn số hàng trả về. Cú pháp đầy đủ: LIMIT offset, row_count hoặc LIMIT row_count OFFSET offset. Phổ biến cho phân trang (pagination).
Cú pháp
SELECT * FROM ten_bang LIMIT offset, so_hang;
-- Hoặc chuẩn SQL:2008
SELECT * FROM ten_bang LIMIT so_hang OFFSET offset;
offset: Số hàng bỏ qua (bắt đầu từ 0). Trang 1: offset=0. Trang 2: offset=pagesize.row_count/so_hang: Số hàng tối đa trả về (page size).
Tạo bảng 13 bản ghi
mysql> CREATE TABLE DemoTable (Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(20));
mysql> INSERT INTO DemoTable (Name) VALUES
('John'),('Larry'),('Bob'),('Sam'),('Mike'),('David'),
('Carol'),('Ramit'),('Adam'),('Chris'),('Robert'),('James'),('Jace');
Lấy 10 hàng đầu tiên (Trang 1, page size=10)
mysql> SELECT * FROM DemoTable LIMIT 0, 10;
+----+--------+
| Id | Name |
+----+--------+
| 1 | John |
| 2 | Larry |
| 3 | Bob |
| 4 | Sam |
| 5 | Mike |
| 6 | David |
| 7 | Carol |
| 8 | Ramit |
| 9 | Adam |
| 10 | Chris |
+----+--------+
Lấy trang 2 (hàng 11-13)
mysql> SELECT * FROM DemoTable LIMIT 10, 10;
+----+--------+
| Id | Name |
+----+--------+
| 11 | Robert |
| 12 | James |
| 13 | Jace |
+----+--------+
Lưu ý hiệu năng với OFFSET lớn
LIMIT 1000000, 10 buộc MySQL quét 1.000.000 hàng rồi bỏ qua -> chậm. Giải pháp:
- Keyset Pagination (Seek Method):
WHERE id > last_seen_id ORDER BY id LIMIT 10. Rất nhanh, dùng index. - Phù hợp cho phân trang vô hạn (infinite scroll), không phù hợp nhảy trang tùy ý.
Mẹo: Luôn có ORDER BY xác định khi dùng LIMIT để đảm bảo thứ tự ổn định.