เมื่อเราพัฒนาเว็บไซต์หรือระบบ API ที่ต้องดึงข้อมูลจำนวนมากจากฐานข้อมูล เช่น บทความ สินค้า หรือรายการธุรกรรม
การโหลดข้อมูลทั้งหมดในครั้งเดียวอาจทำให้ระบบช้าและกินทรัพยากรสูง ดังนั้นจึงจำเป็นต้องใช้เทคนิค
Pagination หรือการแบ่งข้อมูลออกเป็นหลายหน้า เพื่อให้โหลดข้อมูลทีละส่วน
PostgreSQL รองรับการทำ Pagination ได้หลายวิธี โดยวิธีที่นิยมมีดังนี้
1. Pagination ด้วย LIMIT และ OFFSET
วิธีพื้นฐานที่สุดในการแบ่งหน้าใน PostgreSQL คือการใช้ LIMIT และ OFFSET
ตัวอย่างเช่น ต้องการแสดงข้อมูลหน้าแรกจำนวน 10 รายการ
SELECT *
FROM posts
ORDER BY post_id
LIMIT 10 OFFSET 0;
หน้า 2
SELECT *
FROM posts
ORDER BY post_id
LIMIT 10 OFFSET 10;
หน้า 3
SELECT *
FROM posts
ORDER BY post_id
LIMIT 10 OFFSET 20;
สูตรคำนวณ OFFSET
OFFSET = (page - 1) * limit
ตัวอย่าง
page = 3
limit = 10OFFSET = (3-1)*10 = 20
2. Pagination พร้อม JOIN ตาราง Category
สมมติว่าเรามีตาราง posts, posts_categories และ posts_group_categories
เราสามารถ JOIN และแบ่งหน้าได้แบบนี้
SELECT
p.post_id,
p.post_title,
c.post_category_name,
g.post_group_category_name
FROM posts p
LEFT JOIN posts_categories c
ON p.post_category_id = c.post_category_id
LEFT JOIN posts_group_categories g
ON c.post_group_category_id = g.post_group_category_id
ORDER BY p.post_id DESC
LIMIT 10 OFFSET 0;
3. การนับจำนวนหน้าทั้งหมด
Pagination ที่ดีควรบอกจำนวนหน้าทั้งหมดให้ frontend ด้วย
SELECT COUNT(*)
FROM posts;
ตัวอย่างผลลัพธ์
total_rows = 125
limit = 10total_pages = CEIL(125 / 10) = 13
4. Pagination แบบ Advanced (Keyset Pagination)
ปัญหาของ OFFSET คือถ้าข้อมูลมีหลักแสนหรือหลักล้าน จะทำให้ query ช้าลง
เพราะ PostgreSQL ต้องข้ามข้อมูลจำนวนมาก วิธีที่เร็วกว่าเรียกว่า
Keyset Pagination
หน้าแรก
SELECT *
FROM posts
ORDER BY post_id
LIMIT 10;
หน้าถัดไป
SELECT *
FROM posts
WHERE post_id > 10
ORDER BY post_id
LIMIT 10;
ข้อดีของ Keyset Pagination
- ทำงานเร็วกว่า OFFSET
- รองรับข้อมูลจำนวนมากได้ดี
- เหมาะกับการใช้ใน API
5. Pagination สำหรับ API
ตัวอย่าง query สำหรับใช้กับ API Node.js หรือระบบ backend
SELECT
p.post_id,
p.post_title,
c.post_category_name,
g.post_group_category_name
FROM posts p
LEFT JOIN posts_categories c
ON p.post_category_id = c.post_category_id
LEFT JOIN posts_group_categories g
ON c.post_group_category_id = g.post_group_category_id
ORDER BY p.post_id DESC
LIMIT $1 OFFSET $2;
โดยค่าที่ส่งเข้ามาจะเป็น
$1 = limit
$2 = offset
สรุป
Pagination เป็นเทคนิคสำคัญในการจัดการข้อมูลจำนวนมากใน PostgreSQL
โดยวิธีที่นิยมมี 2 รูปแบบหลัก คือ
- LIMIT + OFFSET เหมาะสำหรับระบบทั่วไปและเข้าใจง่าย
- Keyset Pagination เหมาะสำหรับระบบที่มีข้อมูลจำนวนมากและต้องการประสิทธิภาพสูง
การออกแบบ Pagination ที่ดีจะช่วยให้ระบบทำงานเร็วขึ้น ลดภาระของฐานข้อมูล
และทำให้ผู้ใช้งานสามารถโหลดข้อมูลได้อย่างมีประสิทธิภาพ
