หลักการ LIMIT OFFSET, ROW_COUNT
SELECT * FROM yourTable LIMIT offset, row_count;
offset: ข้ามกี่แถว (เริ่มจาก 0)row_count: จำนวนแถวที่ต้องการ
ตัวอย่าง: ตาราง demo40
CREATE TABLE demo40 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(40)
);
INSERT INTO demo40 (name) VALUES
('Chris'), ('David'), ('Mike'), ('Sam'), ('Carol'), ('bob');
ข้อมูลทั้งหมด (6 แถว)
+----+-------+ | id | name | +----+-------+ | 1 | Chris | | 2 | David | | 3 | Mike | | 4 | Sam | | 5 | Carol | | 6 | bob | +----+-------+
ตัวอย่าง Pagination: หน้าที่ 3, หน้าละ 2 แถว
หน้าที่ 1: LIMIT 0, 2 → id 1,2
หน้าที่ 2: LIMIT 2, 2 → id 3,4
หน้าที่ 3: LIMIT 4, 2 → id 5,6
SELECT * FROM demo40 LIMIT 4, 2;
ผลลัพธ์
+----+-------+ | id | name | +----+-------+ | 5 | Carol | | 6 | bob | +----+-------+
สูตรคำนวณ Offset
offset = (page_number - 1) * page_size
เช่น หน้าที่ 5, หน้าละ 10 → offset = (5-1) × 10 = 40
รูปแบบอื่น: LIMIT row_count OFFSET offset
SELECT * FROM demo40 LIMIT 2 OFFSET 4;
ผลลัพธ์เหมือนกัน (มาตรฐาน SQL:2008)
ข้อควรระวังด้านประสิทธิภาพ
- OFFSET ใหญ่ๆ ทำให้ช้า เพราะ MySQL ต้องอ่าน/ข้ามแถวทั้งหมดก่อน
- สำหรับตารางใหญ่ (>100k rows) ควรใช้ Keyset Pagination (Seek Method):
Keyset Pagination (แนะนำสำหรับข้อมูลมาก)
-- หน้าแรก SELECT * FROM demo40 ORDER BY id LIMIT 10; -- หน้าถัดไป (ใช้ id สุดท้ายของหน้าก่อน) SELECT * FROM demo40 WHERE id > 10 ORDER BY id LIMIT 10;
วิธีนี้เร็วกว่ามาก เพราะใช้ INDEX บน id ได้โดยตรง
MySQL 8.0+: ใช้ OFFSET ... ROWS FETCH NEXT ... ROWS ONLY
SELECT * FROM demo40 ORDER BY id OFFSET 4 ROWS FETCH NEXT 2 ROWS ONLY;