तो मेरे पास एक सारणी है जिसमें 5 मिलियन से अधिक पंक्तियां हैं। जब मैं SQL_CALC_FOUND_ROWS क्वेरी का उपयोग करता हूं तो क्वेरी हमेशा के लिए लटकती है। जब मैं इसे बाहर ले जाता हूं तो प्रश्न एक दूसरे withe LIMIT, 25 के भीतर निष्पादित करता है। मेरा प्रश्न है कि पेजिंग के कारणों की कुल पंक्तियों की संख्या प्राप्त करने का कोई विकल्प है?MySQL SQL_CALC_FOUND_ROWS और अंकन
उत्तर
SQL_CALC_FOUND_ROWS सभी मेल खाने वाली पंक्तियों के लिए स्कैन करने के लिए MySQL को मजबूर करता है, भले ही वे कभी नहीं पहुंचे। आंतरिक रूप से यह वही क्वेरी को LIMIT क्लॉज के बिना निष्पादित किया जा रहा है।
यदि फ़िल्टरिंग आप WHERE के माध्यम से कर रहे हैं तो बहुत पागल नहीं है, तो आप calc_found_rows द्वारा लगाए गए पूर्ण-स्कैन लोड को सहेजने के लिए विभिन्न प्रकार के फ़िल्टर की गणना और कैश कर सकते हैं। असल में "चयन गिनती (*) से ... कहां ...." सबसे संभव जहां क्लॉज के लिए चलाएं।
अन्यथा, आप Google- शैली जा सकते हैं और केवल कुछ पेज नंबरों को थूक सकते हैं जो कभी-कभी वास्तविकता के साथ कोई संबंध नहीं रखते हैं (आप जानते हैं, आप "Goooooooooooogle" देखते हैं, पृष्ठ 3 पर जाते हैं, और अचानक परिणाम निकालते हैं)।
गूगल शैली pagination using MySQL
आप COUNT (*) और स्थिति के आधार पर SQL_CALC_FOUND_ROWS के बीच चयन करना चाहिए को लागू करने के बारे में विस्तृत बात। यदि आपकी क्वेरी खोज मानदंड पंक्तियों का उपयोग करती है जो अनुक्रमणिका में हैं - COUNT (*) का उपयोग करें। इस मामले में माईस्क्ल केवल तालिका में वास्तविक डेटा को छूए बिना इंडेक्स से "पढ़ा जाएगा" जबकि SQL_CALC_FOUND_ROWS विधि डिस्क से पंक्तियों को लोड करेगी जो भारी टेबल पर महंगा और समय लेने वाली हो सकती है।
this article @mysqlperformanceblog में इस विषय पर अधिक जानकारी।
- 1. MySQLi/तैयार स्टेटमेंट्स और SQL_CALC_FOUND_ROWS
- 2. यादृच्छिक क्रम और अंकन Elasticsearch
- 3. अंकन और सूचक-से-सदस्य
- 4. अंकन (Kaminari)
- 5. एटीओएम और आरएसएस जैसे फीड्स में अंकन?
- 6. एकाधिक स्रोतों से अंकन बनाना
- 7. कैसे करूं अंकन
- 8. सी #: अंकन, गणित। छत
- 9. Grails में अंकन
- 10. सीएसएस सिफारिश अंकन
- 11. परिणाम से अंकन
- 12. कोडइग्निटर अंकन समस्या
- 13. रेल - वर्णानुक्रमिक अंकन/नेविगेशन
- 14. कॉच डीबी में अंकन?
- 15. क्लोजर में अंकन
- 16. जावास्क्रिप्ट शाब्दिक अंकन भ्रम
- 17. एक विश्वसनीय सेवा में अंकन
- 18. सिद्धांत: बाएं के साथ अंकन
- 19. प्रतिनिधि कीवर्ड बनाम लैम्ब्डा अंकन
- 20. कैसे अक्षम या नाकाम करने के लिए phpmyadmin के SQL_CALC_FOUND_ROWS
- 21. mongoengine का उपयोग करके अंकन कैसे करें?
- 22. लुसीन में अंकन कैसे प्राप्त करें?
- 23. अंकन: सर्वर साइड या क्लाइंट साइड?
- 24. एक आरईएसटी वेब ऐप में अंकन
- 25. जावा: मूल अंकन, एक बिंदु/डॉट/पिक्सेल
- 26. MySQL सर्वर और MySQL क्लाइंट
- 27. SVN कैरट अंकन SVN पुस्तिका से
- 28. जावास्क्रिप्ट में अंकन के बराबर नहीं jQuery
- 29. WCF DataContract - अंकन सदस्य IsRequired = false
- 30. MySQL: ',', 'और'
हाँ कुछ परिणाम दस लाख से अधिक रिकॉर्ड लौटाएंगे ताकि यह समझ में आए कि क्वेरी क्यों लटकती है। खैर मुझे लगता है कि यह सिर्फ अगले पृष्ठ या पिछले पृष्ठ का एक लिंक होना चाहिए, लेकिन पेजिनेशन न करें जहां यह आपको विभिन्न पृष्ठों पर जाने की अनुमति देता है। यदि एक लाख से अधिक लौटे हैं तो मुझे नहीं लगता कि वे पृष्ठ 10k पर जाने की परवाह करते हैं। – John
@Marc, मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि मुझे 'SQL_CALC_FOUND_ROWS' का उपयोग करना है या सिर्फ मेरी क्वेरी से' LIMIT' खंड 'का उपयोग करना है। आपके उत्तर से, ऐसा लगता है कि आप कह रहे हैं कि इन्हें वही करना चाहिए। क्या यह एक सुरक्षित धारणा है, या यह उससे अधिक जटिल है? धन्यवाद। –
थोड़ा अधिक जटिल। जबकि calc_rows mysql को सभी पंक्तियों पर 'कहां' मैच करने के लिए मजबूर करता है, इसे वास्तव में पूरी पंक्ति को पुनर्प्राप्त नहीं करना पड़ता है, इसलिए कुछ बचत होती है जो डेटा को प्री/लाए नहीं जाता है जो अभी फेंक दिया जाएगा। बहुत बड़े रिकॉर्ड (कई कॉलम), और/या कई पंक्तियों के लिए समझ में आता है। छोटे सेट पर, बचत ध्यान देने योग्य नहीं होगी, लेकिन मुझे नहीं पता कि कटओवर बिंदु कहां है। –