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