Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lấy N hàng đầu tiên (phân trang) trong MySQL với LIMIT

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.