ใช้ ORDER BY, LIMIT, OFFSET สำหรับ Pagination / ดึงช่วงแถว
LIMIT n OFFSET m ข้าม m แถวแรก แล้วเอา n แถวถัดไป ใช้ร่วม ORDER BY เพื่อกำหนดลำดับที่แน่นอน
ตัวอย่างสร้างตารางและข้อมูล 9 แถว
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(20)
);
INSERT INTO DemoTable (StudentName) VALUES
('John'), ('Carol'), ('David'), ('Bob'), ('Chris'), ('Robert'), ('Adam'), ('Mike'), ('Sam');
ข้อมูลในตาราง
+----+-------------+ | Id | StudentName | +----+-------------+ | 1 | John | | 2 | Carol | | 3 | David | | 4 | Bob | | 5 | Chris | | 6 | Robert | | 7 | Adam | | 8 | Mike | | 9 | Sam | +----+-------------+
คำสั่ง: เรียง ID DESC (มาก→น้อย) ข้าม 2 แถว แล้วเอา 4 แถว
SELECT * FROM DemoTable ORDER BY Id DESC LIMIT 4 OFFSET 2;
ผลลัพธ์ (Id: 7, 6, 5, 4)
+----+-------------+ | Id | StudentName | +----+-------------+ | 7 | Adam | | 6 | Robert | | 5 | Chris | | 4 | Bob | +----+-------------+
คำอธิบาย:
ORDER BY Id DESC: 9,8,7,6,5,4,3,2,1OFFSET 2: ข้าม 9, 8LIMIT 4: เอา 7, 6, 5, 4
รูปแบบย่อ: LIMIT 2, 4 (OFFSET 2, LIMIT 4) → LIMIT offset, row_count
⚐ ประสิทธิภาพ Pagination ตารางใหญ่:
OFFSETมาก → ช้า (ต้อง Scan ข้ามแถว) ใช้ Keyset Pagination แทน:WHERE Id < last_seen_id ORDER BY Id DESC LIMIT 4- ต้องมี Index บนคอลัมน์ ORDER BY
- หลีกเลี่ยง OFFSET > 100,000