2011-01-22 15 views
12

तो मेरे पास एक सारणी है जिसमें 5 मिलियन से अधिक पंक्तियां हैं। जब मैं SQL_CALC_FOUND_ROWS क्वेरी का उपयोग करता हूं तो क्वेरी हमेशा के लिए लटकती है। जब मैं इसे बाहर ले जाता हूं तो प्रश्न एक दूसरे withe LIMIT, 25 के भीतर निष्पादित करता है। मेरा प्रश्न है कि पेजिंग के कारणों की कुल पंक्तियों की संख्या प्राप्त करने का कोई विकल्प है?MySQL SQL_CALC_FOUND_ROWS और अंकन

उत्तर

6

SQL_CALC_FOUND_ROWS सभी मेल खाने वाली पंक्तियों के लिए स्कैन करने के लिए MySQL को मजबूर करता है, भले ही वे कभी नहीं पहुंचे। आंतरिक रूप से यह वही क्वेरी को LIMIT क्लॉज के बिना निष्पादित किया जा रहा है।

यदि फ़िल्टरिंग आप WHERE के माध्यम से कर रहे हैं तो बहुत पागल नहीं है, तो आप calc_found_rows द्वारा लगाए गए पूर्ण-स्कैन लोड को सहेजने के लिए विभिन्न प्रकार के फ़िल्टर की गणना और कैश कर सकते हैं। असल में "चयन गिनती (*) से ... कहां ...." सबसे संभव जहां क्लॉज के लिए चलाएं।

अन्यथा, आप Google- शैली जा सकते हैं और केवल कुछ पेज नंबरों को थूक सकते हैं जो कभी-कभी वास्तविकता के साथ कोई संबंध नहीं रखते हैं (आप जानते हैं, आप "Goooooooooooogle" देखते हैं, पृष्ठ 3 पर जाते हैं, और अचानक परिणाम निकालते हैं)।

+0

हाँ कुछ परिणाम दस लाख से अधिक रिकॉर्ड लौटाएंगे ताकि यह समझ में आए कि क्वेरी क्यों लटकती है। खैर मुझे लगता है कि यह सिर्फ अगले पृष्ठ या पिछले पृष्ठ का एक लिंक होना चाहिए, लेकिन पेजिनेशन न करें जहां यह आपको विभिन्न पृष्ठों पर जाने की अनुमति देता है। यदि एक लाख से अधिक लौटे हैं तो मुझे नहीं लगता कि वे पृष्ठ 10k पर जाने की परवाह करते हैं। – John

+0

@Marc, मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि मुझे 'SQL_CALC_FOUND_ROWS' का उपयोग करना है या सिर्फ मेरी क्वेरी से' LIMIT' खंड 'का उपयोग करना है। आपके उत्तर से, ऐसा लगता है कि आप कह रहे हैं कि इन्हें वही करना चाहिए। क्या यह एक सुरक्षित धारणा है, या यह उससे अधिक जटिल है? धन्यवाद। –

+0

थोड़ा अधिक जटिल। जबकि calc_rows mysql को सभी पंक्तियों पर 'कहां' मैच करने के लिए मजबूर करता है, इसे वास्तव में पूरी पंक्ति को पुनर्प्राप्त नहीं करना पड़ता है, इसलिए कुछ बचत होती है जो डेटा को प्री/लाए नहीं जाता है जो अभी फेंक दिया जाएगा। बहुत बड़े रिकॉर्ड (कई कॉलम), और/या कई पंक्तियों के लिए समझ में आता है। छोटे सेट पर, बचत ध्यान देने योग्य नहीं होगी, लेकिन मुझे नहीं पता कि कटओवर बिंदु कहां है। –

-1

आप COUNT (*) और स्थिति के आधार पर SQL_CALC_FOUND_ROWS के बीच चयन करना चाहिए को लागू करने के बारे में विस्तृत बात। यदि आपकी क्वेरी खोज मानदंड पंक्तियों का उपयोग करती है जो अनुक्रमणिका में हैं - COUNT (*) का उपयोग करें। इस मामले में माईस्क्ल केवल तालिका में वास्तविक डेटा को छूए बिना इंडेक्स से "पढ़ा जाएगा" जबकि SQL_CALC_FOUND_ROWS विधि डिस्क से पंक्तियों को लोड करेगी जो भारी टेबल पर महंगा और समय लेने वाली हो सकती है।

this article @mysqlperformanceblog में इस विषय पर अधिक जानकारी।

+1

"यदि आपकी क्वेरी खोज मानदंड पंक्तियों का उपयोग करती है जो इंडेक्स में नहीं हैं - इंडेक्स जोड़ें" – Andy

+0

आपके द्वारा उल्लिखित आलेख 2007 से है। मेरा मतलब है, गंभीरता से, 5 साल बाद भी आप इसका संदर्भ देते हैं? MySQL में इतनी सारी चीज़ें बदल गई हैं। – Andy

संबंधित मुद्दे