Company insights

การทำ Pagination ใน PostgreSQL


เมื่อเราพัฒนาเว็บไซต์หรือระบบ 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 = 10

OFFSET = (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 = 10

total_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 ที่ดีจะช่วยให้ระบบทำงานเร็วขึ้น ลดภาระของฐานข้อมูล 
และทำให้ผู้ใช้งานสามารถโหลดข้อมูลได้อย่างมีประสิทธิภาพ