1. การใช้งานพื้นฐานของ LIMIT และ OFFSET
In MySQL, LIMIT และ OFFSET เป็นฟีเจอร์ที่มีประโยชน์อย่างยิ่งสำหรับการดึงข้อมูลช่วงเฉพาะจากฐานข้อมูลอย่างมีประสิทธิภาพ โดยการเข้าใจวิธีการทำงานของมัน คุณสามารถดึงเฉพาะบันทึกที่จำเป็นและปรับปรุงประสิทธิภาพของแอปพลิเคชันได้ มาดูการใช้งานพื้นฐานอย่างละเอียดกัน.
บทบาทของคำสั่ง LIMIT และ OFFSET
คำสั่ง LIMIT จำกัดจำนวนแถวที่ส่งกลับ ในขณะที่คำสั่ง OFFSET ระบุตำแหน่งเริ่มต้นสำหรับการดึงข้อมูล โดยการรวมสองคำสั่งนี้เข้าด้วยกัน คุณสามารถดึงเฉพาะช่วงของบันทึกที่ต้องการจากชุดข้อมูลขนาดใหญ่ได้.
ตัวอย่าง
ตัวอย่างต่อไปนี้ดึงข้อมูล 10 แถว เริ่มจากแถวที่ 20.
SELECT * FROM table_name LIMIT 10 OFFSET 20;
ในคิวรีนี้ การดึงข้อมูลเริ่มจากแถวที่ 20 เนื่องจาก OFFSET และ LIMIT จำกัดผลลัพธ์ให้เหลือ 10 แถว หากไม่มีการระบุ OFFSET จะถือว่าเป็น 0 และจำนวนแถวที่ระบุจะถูกดึงจากจุดเริ่มต้นของตาราง.
พฤติกรรมเมื่อไม่มีการระบุ OFFSET
หากไม่มีการระบุ OFFSET จำนวนแถวที่ระบุโดย LIMIT จะถูกดึงเริ่มจากจุดเริ่มต้นของตาราง ตัวอย่างเช่น คิวรีต่อไปนี้ดึง 10 แถวแรกของตาราง.
SELECT * FROM table_name LIMIT 10;
2. วิธีการทำ Pagination
เมื่อจัดการกับข้อมูลจำนวนมากบนเว็บไซต์หรือแอปพลิเคชัน การแสดงบันทึกทั้งหมดในครั้งเดียวไม่เป็นไปได้ ดังนั้นการทำ pagination—การแบ่งข้อมูลเป็นหน้า—จึงเป็นแนวปฏิบัติทั่วไป โดยการใช้ LIMIT และ OFFSET คุณสามารถดึงบันทึกที่แตกต่างกันสำหรับแต่ละหน้าได้.
การตั้งค่า LIMIT และ OFFSET ตามหมายเลขหน้า
หากคุณแสดง 10 รายการต่อหน้า OFFSET จะเป็น 0 สำหรับหน้า 1, 10 สำหรับหน้า 2, 20 สำหรับหน้า 3 เป็นต้น วิธีนี้ทำให้คุณสามารถปรับ LIMIT และ OFFSET ตามหมายเลขหน้าได้อย่างไดนามิก.
ตัวอย่าง
คิวรีสำหรับหน้า 1:
SELECT * FROM table_name LIMIT 10 OFFSET 0;
คิวรีสำหรับหน้า 2:
SELECT * FROM table_name LIMIT 10 OFFSET 10;
โดยการปรับ OFFSET ตามหมายเลขหน้า คุณจะสามารถดึงข้อมูลที่ถูกต้องสำหรับแต่ละหน้าได้.
ข้อควรพิจารณาที่สำคัญสำหรับ Pagination
เมื่อทำ pagination ด้วย OFFSET ควรระวังว่าระยะเวลาการประมวลผลคิวรีจะเพิ่มขึ้นเมื่อตำแหน่งเริ่มต้นเคลื่อนที่ไกลเข้าไปในชุดข้อมูล เนื่องจากฐานข้อมูลต้องอ่านและข้ามแถวทั้งหมดจนถึง OFFSET ที่ระบุ.
3. ข้อควรพิจารณาด้านประสิทธิภาพเมื่อใช้ OFFSET
หากชุดข้อมูลมีขนาดใหญ่ การใช้ OFFSET บ่อยครั้งอาจทำให้ประสิทธิภาพของคิวรีลดลงอย่างมาก ตัวอย่างเช่น เมื่อดึงข้อมูลจากส่วนท้ายของตารางที่มีหลายล้านแถว ฐานข้อมูลต้องสแกนแถวทั้งหมดก่อนถึง OFFSET ที่ระบุ.
ตัวอย่างของการลดประสิทธิภาพ
หากคุณดึง 10 แถวเริ่มจากแถวที่ 1,000,000 ฐานข้อมูลต้องข้ามแถวแรก 999,990 แถว ดังนั้นค่าของ OFFSET ยิ่งใหญ่ เวลาในการประมวลผลก็จะยิ่งยาวขึ้น.
การปรับปรุงประสิทธิภาพด้วยดัชนี
เมื่อใช้ LIMIT และ OFFSET ดัชนีที่กำหนดค่าอย่างเหมาะสมบางครั้งสามารถลดเวลาการดำเนินคิวรีได้ โดยเฉพาะการเพิ่มดัชนีให้กับเงื่อนไขการค้นหาจะทำให้ฐานข้อมูลค้นหาบันทึกเป้าหมายได้อย่างมีประสิทธิภาพมากขึ้น. 
4. วิธี Seek สำหรับ Pagination ที่มีประสิทธิภาพ
เมื่อจัดการกับชุดข้อมูลขนาดใหญ่ การใช้ “วิธี Seek” (หรือที่เรียกว่าการทำ pagination แบบ keyset) แทน OFFSET สามารถปรับปรุงประสิทธิภาพได้อย่างมาก วิธีนี้ดึงหน้าถัดไปโดยอิงจากบันทึกสุดท้ายของหน้าก่อนหน้า ทำให้ไม่ต้องข้ามแถว ซึ่งมีประสิทธิภาพสูงโดยเฉพาะกับชุดข้อมูลขนาดใหญ่.
ตัวอย่างของวิธี Seek
ในวิธี Seek แทนการใช้ OFFSET คุณจะดึงบันทึกโดยอิงค่าคีย์ เช่น id สุดท้ายจากหน้าก่อนหน้า ทำให้ฐานข้อมูลเข้าถึงบันทึกเป้าหมายโดยตรง เพิ่มประสิทธิภาพเมื่อเลื่อนไปยังหน้าต่อ ๆ ไป.
ตัวอย่าง
The following query retrieves the next set of records based on the last id obtained from the previous page.
SELECT * FROM table_name WHERE id > last_id_from_previous_page ORDER BY id ASC LIMIT 10;
With this approach, each query starts from the last record of the previous page, resulting in significant performance improvements.
วิธีการ Seek โดยใช้คีย์อื่น
ในบางกรณี คุณสามารถทำการแบ่งหน้าโดยใช้คอลัมน์อื่นนอกจาก id เช่น คอลัมน์วันที่ โดยการดึงบันทึกหลังจากวันที่เฉพาะ คุณสามารถเลื่อนผ่านหน้าต่างๆ ในลักษณะที่คล้ายกัน วิธีนี้ช่วยให้สามารถใช้ seek method ได้แม้ไม่ใช้ primary key。
5. แนวปฏิบัติที่ดีที่สุดสำหรับการใช้ LIMIT และ OFFSET
เพื่อใช้ LIMIT และ OFFSET อย่างมีประสิทธิภาพ มีแนวปฏิบัติที่ดีหลายประการที่จะต้องปฏิบัติตาม ด้านล่างนี้คือประเด็นสำคัญที่จะช่วยให้คุณเพิ่มประสิทธิภาพสูงสุด。
ใช้ดัชนี
เมื่อใช้ LIMIT และ OFFSET การตั้งดัชนีที่ตรงกับเงื่อนไขค้นหาของคุณจะช่วยให้ฐานข้อมูลทำการค้นหาอย่างมีประสิทธิภาพ โดยเฉพาะอย่างยิ่ง การเพิ่มดัชนีให้กับคอลัมน์ที่ใช้ในการแบ่งหน้าบ่อยๆ จะช่วยให้ดึงข้อมูลได้เร็วแม้กับชุดข้อมูลขนาดใหญ่。
ใช้ Primary Key เป็นตัวอ้างอิง
การใช้ primary key สำหรับการแบ่งหน้าจะช่วยปรับปรุงประสิทธิภาพของดัชนี ทำให้ฐานข้อมูลประมวลผลคำสั่งค้นหาได้เร็วขึ้น。
ใช้ Seek Method
เมื่อทำงานกับชุดข้อมูลขนาดใหญ่ การใช้ seek method แทน OFFSET จะช่วยรักษาประสิทธิภาพแม้ในหน้าถัดๆ ไป วิธีนี้มีประสิทธิภาพโดยเฉพาะสำหรับการจัดการข้อมูลปริมาณมาก。
6. สรุป
LIMIT และ OFFSET ของ MySQL เป็นเครื่องมือที่ทรงพลังสำหรับการดึงข้อมูลอย่างมีประสิทธิภาพ อย่างไรก็ตาม ขึ้นอยู่กับปริมาณข้อมูลและวิธีการดึงข้อมูล อาจมีความเสี่ยงต่อการลดลงของประสิทธิภาพ โดยการกำหนดค่าดัชนีอย่างเหมาะสมและใช้ seek method คุณสามารถรักษาประสิทธิภาพในขณะที่นำการแบ่งหน้าที่มีประสิทธิภาพมาใช้ เมื่อจัดการชุดข้อมูลขนาดใหญ่ พิจารณาใช้ seek method เพื่อผลลัพธ์ที่เหมาะสมที่สุด


