ไวยากรณ์ LIMIT
SELECT * FROM yourTable LIMIT offset, row_count;
offset: จำนวนแถวที่ข้าม (เริ่มจาก 0)row_count: จำนวนแถวที่ต้องการ
ตัวอย่าง: ตาราง demo67
CREATE TABLE demo67 (
id INT,
user_name VARCHAR(40),
user_country_name VARCHAR(20)
);
INSERT INTO demo67 VALUES
(10, 'John', 'US'), (1001, 'David', 'AUS'), (101, 'Mike', 'UK'),
(102, 'Carol', 'AUS'), (110, 'Chris', 'US'), (105, 'David', 'AUS');
ข้อมูลทั้งหมด (6 แถว)
+------+-----------+-------------------+ | id | user_name | user_country_name | +------+-----------+-------------------+ | 10 | John | US | | 1001 | David | AUS | | 101 | Mike | UK | | 102 | Carol | AUS | | 110 | Chris | US | | 105 | David | AUS | +------+-----------+-------------------+
คำสั่ง: แสดง 3 แถวแรก (Offset 0, Limit 3)
SELECT * FROM demo67 LIMIT 0, 3;
ผลลัพธ์
+------+-----------+-------------------+ | id | user_name | user_country_name | +------+-----------+-------------------+ | 10 | John | US | | 1001 | David | AUS | | 101 | Mike | UK | +------+-----------+-------------------+
รูปแบบอื่น: LIMIT row_count OFFSET offset
SELECT * FROM demo67 LIMIT 3 OFFSET 0;
มาตรฐาน SQL:2008 — อ่านง่ายกว่า
Pagination Pattern
Page 1: LIMIT 0, 10 (OFFSET 0) Page 2: LIMIT 10, 10 (OFFSET 10) Page 3: LIMIT 20, 10 (OFFSET 20) ... Page N: LIMIT (N-1)*10, 10
⚠️ ปัญหา LIMIT OFFSET ใหญ่ (Deep Pagination)
MySQL ต้องอ่าน/ข้ามแถวทั้งหมดก่อน Offset → ช้ามากเมื่อ Offset ใหญ่
แก้ไข: Keyset Pagination (Seek Method)
-- หน้าแรก SELECT * FROM demo67 ORDER BY id LIMIT 10; -- หน้าถัดไป (ใช้ id สุดท้ายของหน้าก่อน = 101) SELECT * FROM demo67 WHERE id > 101 ORDER BY id LIMIT 10;
- ใช้ INDEX บน id ได้เต็มที่
- เร็วคงที่ ไม่ขึ้นกับ Page Number
- ต้องมี Unique Sort Key (PK หรือ Unique Index)
MySQL 8.0: OFFSET ... FETCH
SELECT * FROM demo67 ORDER BY id OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;
สรุป
| สถานการณ์ | แนะนำ |
|---|---|
| ข้อมูลน้อย < 10k, Paging ธรรมดา | LIMIT offset, count |
| ข้อมูลเยอะ, Deep Paging | Keyset Pagination (WHERE id > last_id) |
| Infinite Scroll | Keyset Pagination |
| Jump to Page N | LIMIT (ต้องยอมรับช้า) |