Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การแบ่งหน้า (Pagination) ใน MySQL ด้วย LIMIT

หลักการ 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;