मुझे टिप्पणियों से चीजों को मेरे उत्तर में फिर से लिखने दें। आप timestamp
का उपयोग करना चाहते हैं integer
. के बजाय टाइप करें सिर्फ इसलिए कि यह वही है जिसके लिए इसे डिजाइन किया गया था। टाइमस्टैम्प पूर्णांकों और timestamp
. के बीच मैन्युअल रूप से रूपांतरण करना वस्तुएं सिर्फ एक दर्द है और आपको कुछ भी हासिल नहीं होता है। और आपको अंततः अधिक जटिल डेटाटाइम आधारित प्रश्नों के लिए इसकी आवश्यकता होगी।
पेजिनेशन के बारे में एक प्रश्न का उत्तर देने के लिए। आप बस एक प्रश्न करें
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
यदि यह पहली क्वेरी है तो आप lastTimestamp = '3000-01-01'
सेट करें . अन्यथा आप lastTimestamp = last_query.last_row.created
. सेट करते हैं ।
अनुकूलन
ध्यान दें कि यदि तालिका बड़ी है तो ORDER BY created DESC
कुशल नहीं हो सकता है (विशेषकर यदि विभिन्न श्रेणियों के साथ समानांतर कहा जाता है)। इस मामले में आप चलती "टाइम विंडो" का उपयोग कर सकते हैं, उदाहरण के लिए:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
1 day
अंतराल को मनमाने ढंग से चुना जाता है (इसे अपनी आवश्यकताओं के अनुसार ट्यून करें)। आप ऐप में परिणाम भी सॉर्ट कर सकते हैं।
यदि परिणाम खाली नहीं हैं तो आप (अपने ऐप में) अपडेट करते हैं
lastTimestamp = last_query.last_row.created
(यह मानते हुए कि आपने छँटाई कर ली है, अन्यथा आप min(last_query.row.created)
लेते हैं )
यदि परिणाम खाली है तो आप lastTimestamp = lastTimestamp - interval '1 day'
के साथ क्वेरी दोहराते हैं जब तक आप कुछ नहीं लाते। इसके अलावा आपको रोकना होगा अगर lastTimestamp
कम हो जाता है, यानी जब यह कम होता है तो तालिका में कोई अन्य टाइमस्टैम्प (जिसे प्रीफेच किया जाना है)।
वह सब कुछ सम्मिलित करने के लिए कुछ मान्यताओं के तहत है:
new_row.created >= any_row.created
औरnew_row.created ~ current_time
new_row.created
. का वितरण कमोबेश एक समान है
अनुमान 1 सुनिश्चित करता है कि पृष्ठ पर अंक लगाना एक समान डेटा में परिणाम देता है जबकि धारणा 2 केवल डिफ़ॉल्ट 3000-01-01
के लिए आवश्यक है दिनांक। धारणा 3 यह सुनिश्चित करने के लिए है कि जब आपको कई खाली प्रश्न जारी करने हों तो आपके पास कोई बड़ा खाली अंतराल न हो।