तालिका में प्राथमिक कुंजी है। इसका उपयोग करें।
LIMIT
. के बजाय और OFFSET
, प्राथमिक कुंजी पर फ़िल्टर के साथ अपना पेजिंग करें। आपने अपनी टिप्पणी से इसका संकेत दिया:
यादृच्छिक संख्याओं का उपयोग करके पेजिंग (प्रत्येक क्वेरी में "ऑर्डर से अधिक" जोड़ें)
लेकिन आपको इसे कैसे करना चाहिए, इसके बारे में कुछ भी यादृच्छिक नहीं है।
SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2
क्लाइंट को दोनों पैरामीटर, उसके द्वारा देखी गई अंतिम आईडी और लाने के लिए रिकॉर्ड की संख्या निर्दिष्ट करने दें। आपके एपीआई में या तो एक प्लेसहोल्डर, अतिरिक्त पैरामीटर या "फ़ेच द पहले के लिए वैकल्पिक कॉल होना चाहिए। n आईडी" जहां यह WHERE
. को छोड़ देता है क्वेरी से खंड, लेकिन यह तुच्छ है।
यह दृष्टिकोण रिकॉर्ड को क्रम में प्राप्त करने के लिए काफी कुशल इंडेक्स स्कैन का उपयोग करेगा, आम तौर पर एक प्रकार से बचने या सभी छोड़े गए रिकॉर्ड्स के माध्यम से पुनरावृति करने की आवश्यकता से बचने के लिए। क्लाइंट यह तय कर सकता है कि उसे एक बार में कितनी पंक्तियाँ चाहिए।
यह दृष्टिकोण LIMIT
. से भिन्न है और OFFSET
एक प्रमुख तरीके से दृष्टिकोण:समवर्ती संशोधन। अगर आप INSERT
एक कुंजी के साथ तालिका में निचला एक कुंजी की तुलना में कुछ क्लाइंट पहले ही देख चुका है, यह दृष्टिकोण अपने परिणामों को बिल्कुल भी नहीं बदलेगा, जबकि OFFSET
दृष्टिकोण एक पंक्ति दोहराएगा। इसी तरह, अगर आप DELETE
कम-से-पहले से देखी गई आईडी वाली एक पंक्ति इस दृष्टिकोण के परिणाम नहीं बदलेगी, जबकि OFFSET
एक अनदेखी पंक्ति को छोड़ देगा। हालांकि, जेनरेट की गई कुंजियों वाली केवल संलग्न तालिकाओं के लिए कोई अंतर नहीं है।
यदि आप पहले से जानते हैं कि क्लाइंट पूरे परिणाम सेट को चाहता है, तो सबसे कुशल काम यह है कि उन्हें इस पेजिंग व्यवसाय में से कोई भी पूरा परिणाम सेट न भेजें। वहीं मैं करता एक कर्सर का प्रयोग करें। डीबी से पंक्तियों को पढ़ें और उन्हें क्लाइंट को उतनी ही तेजी से भेजें जितना क्लाइंट उन्हें स्वीकार करेगा। इस एपीआई को अत्यधिक बैकएंड लोड से बचने के लिए क्लाइंट को कितनी धीमी गति से चलने की अनुमति दी गई थी, इस पर सीमाएं निर्धारित करने की आवश्यकता होगी; धीमे क्लाइंट के लिए मैं शायद पेजिंग पर स्विच करूंगा (जैसा कि ऊपर वर्णित है) या पूरे कर्सर को एक अस्थायी फ़ाइल में स्पूल करता हूं और डीबी कनेक्शन बंद कर देता हूं।
महत्वपूर्ण चेतावनी :
- एक
UNIQUE
की आवश्यकता है बाधा /UNIQUE
अनुक्रमणिका याPRIMARY KEY
विश्वसनीय होना - विभिन्न समवर्ती संशोधन व्यवहार को सीमित/ऑफ़सेट करने के लिए, ऊपर देखें