आप यह नहीं जान सकते कि किसी दिए गए पृष्ठ पर पहली आईडी क्या है, क्योंकि आईडी नंबर जरूरी नहीं कि अनुक्रमिक हों। दूसरे शब्दों में, अनुक्रम में अंतराल हो सकते हैं, इसलिए 100 पंक्तियों के पांचवें पृष्ठ पर पंक्तियाँ आईडी 500 से शुरू होना जरूरी नहीं है। यह आईडी 527 पर शुरू हो सकता है, उदाहरण के लिए, यह जानना असंभव है।
एक और तरीका बताया:id एक मान है, एक पंक्ति संख्या नहीं।
यदि आपका क्लाइंट आरोही क्रम में पृष्ठों के माध्यम से आगे बढ़ रहा है तो एक संभावित समाधान यह है कि प्रत्येक आरईएसटी अनुरोध डेटा प्राप्त करता है, सबसे बड़ा नोट करता है उस पृष्ठ पर आईडी मान, फिर उसका उपयोग अगले . में करता है आरईएसटी अनुरोध करता है ताकि यह बड़े आईडी मानों से पूछताछ करे।
SELECT ... FROM ... WHERE filterKey = filterValue
AND id > id_of_last_match_of_previous_page
लेकिन अगर आपका आरईएसटी अनुरोध कोई यादृच्छिक पृष्ठ ला सकता है, तो यह समाधान काम नहीं करता है। यह पहले वाले पेज को पहले ही प्राप्त कर लेने पर निर्भर करता है।
एक अन्य उपाय LIMIT <x> OFFSET <y>
. का उपयोग करना है वाक्य - विन्यास। यह आपको किसी भी मनमानी पृष्ठ का अनुरोध करने की अनुमति देता है। LIMIT <y>, <x>
वही काम करता है, लेकिन किसी कारण से x और y दो अलग-अलग वाक्यविन्यास रूपों में उलटे होते हैं, इसलिए इसे ध्यान में रखें।
LIMIT...OFFSET
. का उपयोग कर रहे हैं जब आप किसी ऐसे पृष्ठ का अनुरोध करते हैं, जिसके परिणाम में अनेक पृष्ठ होते हैं, तो यह बहुत प्रभावी नहीं होता है। मान लें कि आप 5,000वें पृष्ठ का अनुरोध करते हैं। MySQL को 5,000 पृष्ठों के सर्वर-साइड पर एक परिणाम उत्पन्न करना है, फिर उनमें से 4,999 को त्यागना है और परिणाम में अंतिम पृष्ठ वापस करना है। क्षमा करें, लेकिन यह इसी तरह काम करता है।
अपनी टिप्पणी दें:
आपको यह समझना होगा कि WHERE
मानों . पर शर्तें लागू करता है पंक्तियों में, लेकिन पृष्ठों को स्थिति . द्वारा परिभाषित किया जाता है पंक्तियों की। ये पंक्तियों को निर्धारित करने के दो अलग-अलग तरीके हैं!
यदि आपके पास एक कॉलम है जो पंक्ति-संख्या . होने की गारंटी है , तो आप उस मान का उपयोग पंक्ति स्थिति की तरह कर सकते हैं। आप उस पर एक अनुक्रमणिका भी लगा सकते हैं, या इसे प्राथमिक कुंजी के रूप में उपयोग कर सकते हैं।
लेकिन प्राथमिक कुंजी मान बदल सकते हैं, और लगातार नहीं हो सकते हैं, उदाहरण के लिए यदि आप पंक्तियों को अपडेट करते हैं या हटाते हैं, या कुछ लेनदेन रोलबैक करते हैं, और इसी तरह। प्राथमिक कुंजी मानों को फिर से क्रमांकित करना एक बुरा विचार है क्योंकि अन्य तालिकाएँ या बाहरी डेटा प्राथमिक कुंजी मानों को संदर्भित कर सकते हैं।
तो आप एक और कॉलम जोड़ सकते हैं जो नहीं है प्राथमिक कुंजी, लेकिन केवल एक पंक्ति-संख्या।
ALTER TABLE MyTable ADD COLUMN row_number BIGINT UNSIGNED, ADD KEY (row_number);
फिर जब आपको पंक्तियों को फिर से क्रमांकित करने की आवश्यकता हो तो मान भरें।
SET @row := 0;
UPDATE MyTable SET row_number = (@row := @row + 1) ORDER BY id;
उदाहरण के लिए, यदि आप कभी कुछ हटाते हैं, तो आपको पंक्तियों को फिर से क्रमांकित करना होगा। तालिका के आकार के आधार पर इसे बार-बार करना कारगर नहीं है।
साथ ही, नई प्रविष्टियां तालिका को लॉक किए बिना सही पंक्ति संख्या मान नहीं बना सकतीं। दौड़ की स्थिति को रोकने के लिए यह आवश्यक है।
यदि आपके पास गारंटी है कि row_number
क्रमागत मानों का एक क्रम है, तो यह एक मान और एक पंक्ति स्थिति दोनों है, इसलिए आप पंक्तियों के किसी भी मनमाने पृष्ठ के लिए उच्च-प्रदर्शन अनुक्रमणिका लुकअप के लिए इसका उपयोग कर सकते हैं।
SELECT * FROM MyTable WHERE row_number BETWEEN 401 AND 500;
कम से कम अगली बार जब तक पंक्ति संख्याओं के अनुक्रम को हटाकर या नए सम्मिलन द्वारा संदेह में डाल दिया जाता है।