MySQL कैश प्रश्न करता है?


19

मैं PHP डेटा ऑब्जेक्ट्स (PDO) के साथ एक MySQL डेटाबेस को बदल रहा हूं और एक व्यापक SQL क्वेरी को निष्पादित कर रहा हूं । आम तौर पर, यह लगभग 1500 एमएस लेता है; मुझे अभी भी इसे अनुकूलित करने की आवश्यकता है। जब मैं बीच में एक छोटे अंतराल के साथ दो बार PHP स्क्रिप्ट चलाता हूं, तो क्वेरी केवल लगभग 90 एमएस लेती है। क्वेरी दोनों मामलों में समान है। जब मैं स्क्रिप्ट चलाता हूं, उसी क्वेरी के साथ, कुछ समय बाद फिर से 1500 एमएस लेता है।

ऐसा क्यों है? डेटाबेस कैश स्वचालित रूप से करता है? क्या कुछ समय डेटाबेस कैश को बचाता है और फिर स्वचालित रूप से इसे हटा देता है?

मुझे लगता है कि परिणाम PHP द्वारा कैश नहीं किए जा सकते, क्योंकि यह दो अलग-अलग थ्रेड्स में होता है। मुझे नहीं लगता कि PHP परिणामों को कैश करेगा, क्योंकि यह नहीं जान सकता कि डेटाबेस बदल गया है या नहीं।

डेटाबेस में नई पंक्तियाँ सम्मिलित करने के लिए मेरे पास प्रत्येक मिनट में एक स्क्रिप्ट चल रही है। यह भी कारण हो सकता है कि यह कुछ समय बाद फिर से 1500 एमएस लेता है; कैश हटा दिया गया होगा, क्योंकि संबंधित टेबल अब समान नहीं हैं।


मुझे अपना कोड दिखाओ। मुझे आपकी क्वेरी की आवश्यकता नहीं है, बस एक तरीका है कि आप इसे कैसे परख रहे हैं।

3
हाँ, mySQL caches पूछताछ करता है। यह उस तरह चतुर है।

@ कोड क्या कोड है? यह सिर्फ बुनियादी पीडीओ है, लेकिन मुझे नहीं लगता कि PHP इसे कैश कर सकता है क्योंकि मैं दो बार PHP स्क्रिप्ट चलाता हूं, मैं एक स्क्रिप्ट में दो बार क्वेरी नहीं चलाता। आप यह भी बता सकते हैं कि आपने पोडो को क्यों संपादित किया जबकि यह वास्तव में प्रश्न के लिए प्रासंगिक नहीं है?

3
सभी DBMSes में किसी न किसी तरह का पेज-स्तर कैश होता है। कई क्वेरी निष्पादन योजनाओं या यहां तक ​​कि क्वेरी परिणामों ( MySQL सहित ) को कैशिंग करके उससे आगे जाते हैं । मुझे संदेह है कि यह अंतिम चीज आपके द्वारा देखे गए व्यवहार के लिए मुख्य अपराधी है।
ब्रांको दिमित्रिजेविक

आप हर मिनट आवेषण कर रहे हैं? क्रमबद्ध करें कि पहले!
१२:२३ पर थॉमस

जवाबों:


15

यह संभवतः MySQL क्वेरी कैश की एक कलाकृति है ।

आप SQL क्वेरी निष्पादित करते हैं, MySQL अपने परिणाम और अगले निष्पादन को तेज करता है। जब आप अपनी क्वेरी द्वारा संदर्भित तालिकाओं में डेटा सम्मिलित करने के लिए स्क्रिप्ट चलाते हैं, तो परिणाम कैश अमान्य हो जाता है और अगली बार क्वेरी को "वास्तविक के लिए" निष्पादित किया जाना चाहिए।

ऊपर लिंक MySQL के दस्तावेज़ से:

एक क्वेरी मिक्स जिसमें सेलेक्ट स्टेटमेंट्स के लगभग पूरी तरह से सेट होता है, कैश को मिक्स की तुलना में सक्षम करने से बहुत अधिक लाभ होता है, जिसमें अक्सर INSERT स्टेटमेंट्स कैशे में परिणाम के लगातार अमान्य होने का कारण बनते हैं।


5

हां, mySQL (सामान्य रूप से अन्य सभी लोकप्रिय डेटाबेस उत्पादों के साथ) इस पर किए गए प्रश्नों को कैश करता है।

कैशिंग बहुत चालाक है - यह अक्सर क्वेरी के लिए कैश का उपयोग कर सकता है, भले ही क्वेरी के सटीक पैरामीटर समान न हों। इससे प्रदर्शन पर बड़ा फर्क पड़ सकता है।

कैबिंग को पूरी तरह से डीबी सर्वर सॉफ्टवेयर के अंदर नियंत्रित किया जाता है; आपके पास कैश की कोई दृश्यता नहीं है, और न ही कोई आइटम कैश में कितनी देर तक रहता है; यह किसी भी समय ओवरराइट किया जा सकता है जो इस बात पर निर्भर करता है कि अन्य प्रश्नों को क्या कहा जा रहा है, आदि यह प्रदर्शन की सहायता के लिए है, लेकिन इसे प्रदर्शन के लिए निर्भर नहीं होना चाहिए।

आप इसके बारे में यहाँ MySQL मैनुअल में अधिक पढ़ सकते हैं

इसके अलावा, पीडीओ का उपयोग करने से आप अपने प्रश्नों को "तैयार किए गए बयान" के रूप में लिख सकते हैं, मापदंडों को कठोर बनाने के बजाय उन्हें एक सादे पाठ क्वेरी स्ट्रिंग में कोडित कर सकते हैं। यह भी DB सर्वर पर कैशिंग निहितार्थ है और दोहराया जाने वाले प्रश्नों के लिए, प्रदर्शन में भी सुधार करेगा।


2
"MySQL 5.1.17 के अनुसार, क्वेरी कैश का उपयोग धारा 8.6.3.1 में वर्णित शर्तों के तहत तैयार किए गए बयानों के लिए किया जाता है," क्वेरी कैश कैसे संचालित होता है "। 5.1.17 से पहले, क्वेरी कैश तैयार बयानों के लिए उपयोग नहीं किया जाता है। dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
" सामान्य रूप से अन्य सभी लोकप्रिय डेटाबेस उत्पादों के साथ ": यह थोड़ा भ्रामक है। शायद ही कोई डीबीएमएस सक्रिय रूप से क्वेरी कैश परिणाम रास्ता MySQL करता है। DBMS आमतौर पर केवल कैश टेबल (या इंडेक्स) डेटा होता है , क्वेरी परिणाम नहीं । उनमें से अधिकांश क्वेरी एक्साइज प्लान (और क्वेरी "स्रोत") को कैश करते हैं
a_horse_with_no_name

3
"यह अक्सर क्वेरी के लिए कैश का उपयोग कर सकता है, भले ही क्वेरी के सटीक पैरामीटर समान न हों" पूरी तरह से गलत है। कैश से सर्व किए जाने के लिए क्वेरी को पहले से निष्पादित और स्टिल-कैश्ड क्वेरी के समान बाइट-फॉर-बाइट होना चाहिए। यहां तक कि एक अन्यथा समान क्वेरी के बीच अंतर SELECT *और select *अर्थ कैश से नहीं परोसा जाएगा। dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html । स्थिरता के लिए 5.1 लिंक पोस्ट किया गया, लेकिन सभी संस्करणों पर लागू होता है।
माइकल - sqlbot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.