การเพจที่มีประสิทธิภาพใน SQLite พร้อมบันทึกนับล้าน


102

ฉันต้องการแสดงผลลัพธ์ SQLite ในมุมมองรายการ แน่นอนฉันต้องการหน้าผลลัพธ์

ตัวเลือกแรกคือการใช้ประโยค LIMIT ตัวอย่างเช่น:

SELECT * FROM Table LIMIT 100, 5000

ส่งคืนระเบียน 5001 ถึง 5100 ปัญหาคือ SQLite ภายใน "อ่าน" ระเบียน 5,000 รายการแรกและไม่มีประสิทธิภาพมากเกินไป

อะไรคือแนวทางที่ดีที่สุดสำหรับการเพจเมื่อมีเรกคอร์ดจำนวนมาก

คำตอบ:


119

โปรดทราบว่าคุณต้องใช้ORDER BYอนุประโยคเสมอ มิฉะนั้นคำสั่งจะเป็นไปโดยพลการ

ในการทำเพจที่มีประสิทธิภาพให้บันทึกค่าที่แสดงครั้งแรก / สุดท้ายของฟิลด์ที่สั่งซื้อและดำเนินการต่อหลังจากนั้นเมื่อแสดงหน้าถัดไป:

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;

(อธิบายพร้อมรายละเอียดเพิ่มเติมเกี่ยวกับวิกิ SQLite )

เมื่อคุณมีคอลัมน์การจัดเรียงหลายคอลัมน์ (และ SQLite 3.15 หรือใหม่กว่า) คุณสามารถใช้การเปรียบเทียบค่าแถวสำหรับสิ่งนี้:

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;

8
แล้วกรณีที่คุณมี 101 ค่าที่เหมือนกันใน SomeColumn ล่ะ? น่าจะดีกว่านี้: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz

6
@ JacekŁawrynowiczหากคอลัมน์การจัดเรียงไม่ซ้ำกันคุณต้องจัดเรียงตามคอลัมน์เพิ่มเติม อย่างไรก็ตามหากคุณมีคำตอบอื่นให้สร้างคำตอบ
CL.

@CL ถ้าฉันต้องการทำสิ่งนี้ด้วยการเข้าร่วมแบบสอบถามวิธีการทำกับหลายเงื่อนไขและ
YLS

@YLS ปัจจุบันคุณสามารถใช้ค่าแถว
CL.

2
ปัญหาในการใช้แนวทางนี้อธิบายสั้น ๆ ได้จากความคิดเห็นนี้
mr5
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.