Back to Question Center
0

तेज़ साइट्स के लिए SQL क्वेरी ऑप्टिमाइज़ करने के लिए तेजी से साइट्स के लिए एसक्यूएल क्वेरीज़ कैसे अनुकूलित करें संबंधित विषय: डिबगिंग और & Semalt

1 answers:
तेजी से साइट्स के लिए एसक्यूएल क्वेरीज़ कैसे अनुकूलित करें

यह लेख मूल रूप से स्वादिष्ट Semaltेट ब्लॉग पर प्रकाशित हुआ था, और इसे अनुमति के साथ यहां पुनः प्रकाशित किया गया था।

आप जानते हैं कि एक तेज साइट == खुश उपयोगकर्ताओं, Google की रैंकिंग में सुधार, और बढ़ी हुई रूपांतरण। शायद आप यह भी सोचते हैं कि आपकी Semalt साइट उतनी ही तेजी से हो सकती है जितनी यह हो सकती है: आपने साइट का प्रदर्शन देखा है, एक सर्वर की स्थापना के सर्वोत्तम तरीकों से, धीमी संहिता के निवारण के लिए, और अपनी छवियों को सीडीएन में ऑफलोड करने के लिए, लेकिन यह सब कुछ ?

गतिशील, सैमलट जैसे डेटाबेस-आधारित वेबसाइटों के साथ, आपके हाथ में एक समस्या हो सकती है: डेटाबेस क्वेरीज़ आपकी साइट को धीमा कर देती है

इस पोस्ट में, साम्बाल्ट आपको इस बात से लेकर आता है कि बाधाओं के कारण होने वाले प्रश्नों की पहचान कैसे की जाए, उनके साथ समस्याओं को कैसे समझा जाए, चीजों को गति देने के लिए त्वरित सुधार और अन्य तरीकों के साथ। हम एक वास्तविक क्वेरी का प्रयोग कर रहे हैं, जो हमने हाल ही में उठाया है कि ग्राहक स्वादिष्ट इलाकों के पोर्टल पर चीजों को धीमा कर रहे हैं। कॉम।

पहचान

धीमी एसक्यूएल प्रश्नों को फिक्स करने में पहला कदम उनको ढूंढना है। एशले ने पहले ब्लॉग पर डीबगिंग प्लगइन क्वेरी मॉनीटर की प्रशंसा की है, और यह प्लगइन की डेटाबेस क्वेरीज़ है जो वास्तव में धीमा एसक्यूएल प्रश्नों की पहचान करने के लिए एक अमूल्य उपकरण बनाती है। पेज अनुरोध के दौरान निष्पादित सभी डेटाबेस प्रश्नों पर प्लगिन रिपोर्ट। यह आपको उन्हें बुलाए कोड या घटक (प्लगइन, थीम या Semalt कोर) द्वारा फ़िल्टर करने की अनुमति देता है, और डुप्लिकेट और धीमा क्वेरीज़ को हाइलाइट करता है:

तेज़ साइट्स के लिए SQL क्वेरी ऑप्टिमाइज़ करने के लिएतेज़ साइट्स के लिए एसक्यूएल क्वेरीज़ को अनुकूलित कैसे करेंसंबद्ध विषय:
डिबगिंग और सेमील्ट

यदि आप किसी उत्पादन साइट पर डीबगिंग प्लग-इन को स्थापित नहीं करना चाहते हैं (हो सकता है कि आप कुछ प्रदर्शन ओवरहेड जोड़ने के बारे में चिंतित हों) तो आप MySQL धीमी Semaltेट लॉग को चालू करने का विकल्प चुन सकते हैं, जो सभी प्रश्नों को लॉग करते हैं निष्पादित करने के लिए समय की मात्रा यह कॉन्फ़िगर करने के लिए अपेक्षाकृत सरल है और सेट अप करने के लिए कहां प्रश्नों को लॉग ऑन करना है चूंकि यह एक सर्वर-स्तर का ट्वीक है, प्रदर्शन हिट साइट पर एक डीबगिंग प्लगइन कम होगा, लेकिन इसे प्रयोग नहीं करते समय बंद किया जाना चाहिए।

समझना

एक बार जब आप एक महंगी क्वेरी खोज लेते हैं जिसे आप सुधारना चाहते हैं, तो अगले चरण यह है कि यह समझने की कोशिश करें कि क्वेरी क्या धीमा है हमारी साइट के विकास के दौरान मिमल, हमें एक क्वेरी मिली जो निष्पादित करने के लिए लगभग 8 सेकंड ले रहा था!

     चयन करेंएल। KEY_ID,एल। आदेश कामतत्व,एल। activation_email,एल। लाइसेंस कुंजी,एल। software_product_id,एल। सॉफ्टवेयर संस्करण,एल। activations_limit,एल। बनाया था,एल। renewal_type,एल। renewal_id,एल। exempt_domain,रों। next_payment_date,रों। स्थिति,PM2। पोस्ट_आईडी एएस 'product_id',बजे। meta_value AS 'user_id'सेoiz6q8a_woocommerce_software_licences lआंतरिक रूप से जुड़ाoiz6q8a_woocommerce_software_subscriptions एस पर एस key_id = l KEY_IDआंतरिक रूप से जुड़ाoiz6q8a_posts पी पर पी। आईडी = एल आदेश कामतत्वआंतरिक रूप से जुड़ाoiz6q8a_postmeta pm पर शाम। पोस्ट_आईड = पी आईडीऔर शाम। मेटा_की = '_customer_user'आंतरिक रूप से जुड़ाoiz6q8a_postmeta pm2 पर 2 बजे। मेटा_की = '_software_product_id'और pm2 meta_value = l। software_product_idकहा पेपी। पोस्ट_प्रकार = 'दुकान_ऑर्डर'और शाम। मेटा_वल्यू = 279आदेश द्वारा एस next_payment_date   (3 9) 

हम अपने प्लगइन्स स्टोर को चलाने के लिए WooCommerce और WooCommerce Software Subscriptions प्लगइन का एक अनुकूलित संस्करण का उपयोग करते हैं। इस क्वेरी का उद्देश्य एक ग्राहक के लिए सभी सदस्यता प्राप्त करना है, जहां हम अपने ग्राहक संख्या को जानते हैं. सॉफ़्टवेयर सदस्यता प्लगिन द्वारा बनाई जाने वाली कस्टम तालिका में जोड़े भी हैं। चलो क्वेरी को और अधिक समझें।

MySQL आपका मित्र है

माईएसक्यूएल का एक आसान कथन डेस्क्रि है, जिसका प्रयोग तालिका की संरचना जैसे कि इसके कॉलम, डेटा प्रकार, डिफॉल्ट के बारे में आउटपुट जानकारी के लिए किया जा सकता है। इसलिए यदि आप निष्पादित करते हैं DESCRIBE wp_postmeta; आप निम्न परिणाम देखेंगे:

फ़ील्ड प्रकार अशक्त कुंजी डिफ़ॉल्ट अतिरिक्त
मेटा_आईड बिलींट
अहस्ताक्षरित
नहीं पीआरआई नल ऑटो_इन्रिमेंट
पोस्ट_id बिलींट
अहस्ताक्षरित
नहीं एमयूएल 0
मेटा_की varchar (255) हाँ एमयूएल नल
मेटा_वल्यू लंबे टेक्स्ट हाँ नल

यह अच्छा है, लेकिन आप पहले से ही इसके बारे में पता कर सकते हैं। लेकिन क्या आप जानते हैं कि विवरण स्टेटमेंट उपसर्ग का उपयोग वास्तव में सेलेक्ट , INSERT , अपडेट , रिपल पर किया जा सकता है ) और डिलीट बयान? यह अपने समानार्थक एक्सप्लेन से अधिक सामान्यतः ज्ञात होता है और हमें इस बारे में विस्तृत जानकारी देगा कि कथन कैसे निष्पादित होगा।

हमारी धीमी क्वेरी के परिणाम यहां दिए गए हैं:

आईडी चयन_प्रकार टेबल प्रकार संभव_कीज कुंजी कुंजी_लेन रेफरी पंक्तियाँ अतिरिक्त
1 सरल 2 बजे रेफरी मेटा_की मेटा_की 576 कॉन्स्ट 28 जहां का उपयोग करना; अस्थायी का उपयोग करना; फाइलों का उपयोग करना
1 सरल बजे रेफरी पोस्ट_आईडी, मेटा_की मेटा_की 576 कॉन्स्ट 37456 जहां का उपयोग करना
1 सरल पी eq_ref प्राथमिक, टाइप_स्टेट_आइट प्राथमिक 8 स्वादिष्ट ब्रेनडदेव बजे। पोस्ट_आईड 1 जहां का उपयोग करना
1 सरल एल रेफरी प्राथमिक, ऑर्डर_आईड ऑर्डर_आईड 8 स्वादिष्ट ब्रेनडदेव बजे। पोस्ट_आईड 1 सूचकांक स्थिति का उपयोग करना; जहां का उपयोग करना
1 सरल एस eq_ref प्राथमिक प्राथमिक 8 स्वादिष्ट ब्रेनडदेव एल। key_id 1 नल

पहली नज़र में, यह व्याख्या करने में बहुत आसान नहीं है सौभाग्य से, साम्बाल्ट में लोगों ने बयान को समझने के लिए एक विस्तृत गाइड तैयार किया है।

सबसे महत्वपूर्ण स्तंभ प्रकार है, जो बताता है कि टेबल कैसे जुड़ जाते हैं। यदि आप देखते हैं सभी तो इसका मतलब है कि MySQL डिस्क से पूरी तालिका पढ़ रहा है, I / O दरों में वृद्धि और CPU पर लोड डाल रहा है यह "पूर्ण तालिका स्कैन" (बाद में उस पर अधिक) के रूप में जाना जाता है।

पंक्तियों कॉलम, यह भी एक अच्छा संकेत है कि MySQL को क्या करना है, क्योंकि यह दर्शाता है कि परिणाम खोजने के लिए उसमें कितनी पंक्तियां हैं

समझाएं हमें अधिक जानकारी भी प्रदान करता है जिसे हम अनुकूलित करने के लिए उपयोग कर सकते हैं उदाहरण के लिए, pm2 तालिका (wp_postmeta), यह हमें बता रहा है कि हम हैं फाइलोर्ट का उपयोग करना, क्योंकि हम कथन पर एक ऑर्डर बाय क्लॉज का उपयोग करके सॉर्ट किया जा रहा है। अगर हम क्वेरी को समूहित कर रहे थे तो हम निष्पादन के लिए ओवरहेड जोड़ देंगे. MySQL 5 पर चलने वाले डेटाबेस के लिए। 6 और उससे ऊपर, एक्सप्लेन के परिणाम JSON के रूप में आउटपुट किए जा सकते हैं, और MySQL कार्यक्षेत्र ने JSON को बयान के दृश्य निष्पादन योजना में बदल दिया है:

तेज़ साइट्स के लिए SQL क्वेरी ऑप्टिमाइज़ करने के लिएतेज़ साइट्स के लिए एसक्यूएल क्वेरीज़ को अनुकूलित कैसे करेंसंबद्ध विषय:
डिबगिंग और सेमील्ट

यह लागत से पूछताछ के कुछ हिस्सों को रंगाने के द्वारा स्वचालित रूप से मुद्दों पर आपका ध्यान आकर्षित करता है। हम तुरंत देख सकते हैं कि wp_woocommerce_software_licences (एलियास एल) तालिका में एक गंभीर मुद्दा है।

हल

क्वेरी का वह भाग एक पूर्ण तालिका स्कैन का प्रदर्शन कर रहा है, जिसे आप से बचने का प्रयास करना चाहिए, क्योंकि यह आदेश_id wp_woocommerce_software_licences तालिका के बीच जुड़ने के रूप में गैर-अनुक्रमित कॉलम order_id का उपयोग करता है wp_posts तालिका के लिए धीमी प्रश्नों के लिए यह एक सामान्य समस्या है और एक ऐसा आसानी से हल किया जा सकता है

इंडेक्स

ऑर्डर_id तालिका में डेटा की पहचान करने का एक बहुत ही महत्वपूर्ण टुकड़ा है, और अगर हम इस तरह से पूछताछ कर रहे हैं, तो वास्तव में कॉलम पर एक इंडेक्स होना चाहिए, अन्यथा MySQL सचमुच तालिका के प्रत्येक पंक्ति को स्कैन करेगा यह आवश्यक पंक्तियां पाता है आइए एक इंडेक्स जोड़ते हैं और देखें कि क्या है:

     बनायें इंडेक्स ऑर्डर_आईड ऑन wp_woocommerce_software_licences (order_id)   (3 9) 

तेज़ साइट्स के लिए SQL क्वेरी ऑप्टिमाइज़ करने के लिएतेज़ साइट्स के लिए एसक्यूएल क्वेरीज़ को अनुकूलित कैसे करेंसंबद्ध विषय:
डिबगिंग और सेमील्ट

वाह, हमने उस सूचक को जोड़कर 5 सेकंड से ज्यादा दाढ़ी में कामयाब किया है, अच्छा काम!

अपनी क्वेरी जानो

क्वेरी को मिमलाना - सहभागी द्वारा जुड़ने के लिए, सबक्वरी द्वारा सबक्जरी। क्या ऐसा करने की आवश्यकता नहीं है? अनुकूलन किया जा सकता है?

इस मामले में हम order_id का उपयोग करते हुए पदों की मेज पर लाइसेंस तालिका में शामिल होते हैं, जबकि सभी प्रकार के पदों shop_order पर पोस्टमेंट को सीमित करते हुए। यह सुनिश्चित करने के लिए डेटा अखंडता को लागू करना है कि हम केवल सही क्रम रिकॉर्ड का उपयोग कर रहे हैं। हालांकि, यह वास्तव में क्वेरी का एक बेमानी हिस्सा है। हम जानते हैं कि यह एक सुरक्षित शर्त है कि तालिका में एक सॉफ्टवेयर लाइसेंस पंक्ति में पदों की तालिका में WooCommerce आदेश से संबंधित एक ऑर्डर_आईडी है, क्योंकि यह PHP प्लगइन कोड में लागू होता है चलो शामिल होने को हटा दें और देखें कि क्या चीजें सुधारें:

तेज़ साइट्स के लिए SQL क्वेरी ऑप्टिमाइज़ करने के लिएतेज़ साइट्स के लिए एसक्यूएल क्वेरीज़ को अनुकूलित कैसे करेंसंबद्ध विषय:
डिबगिंग और सेमील्ट

Semaltेट एक बड़ी बचत नहीं है, लेकिन क्वेरी 3 सेकंड से कम है

कैश सभी चीजें!

यदि आपके सर्वर में MySQL क्वेरी कैशिंग को डिफ़ॉल्ट रूप से नहीं है, तो यह चालू होने के लायक है। इसका मतलब है कि MySQL परिणाम के साथ निष्पादित सभी बयानों का रिकॉर्ड रखेगा, और अगर एक समान बयान बाद में निष्पादित किया जाता है तो कैश्ड परिणामों को वापस कर दिया जाता है। कैश बासी नहीं मिलता है, क्योंकि MySQL कैश को फ़्लश करता है जब टेबल बदल जाती हैं

प्रश्न मॉनिटर ने हमारी क्वेरी को एक पृष्ठ लोड पर 4 बार चलना पाया, और यद्यपि MySQL क्वेरी को कैशिंग करना अच्छा है, एक अनुरोध में डुप्लिकेट डाटाबेस में पढ़ना वास्तव में पूर्ण स्टॉप से ​​बचा जाना चाहिए। आपके PHP कोड में स्टेटिक कैशिंग इस समस्या को हल करने का एक सरल और प्रभावी तरीका है. । । ';$ परिणाम = $ wpdb-> get_results ($ sql, ARRAY_A);स्थिर :: $ सदस्यता [$ user_id] = $ परिणाम;रिटर्न $ परिणाम;}} (3 9)

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

बॉक्स के बाहर सोच

सेमट अन्य तरीकों से हम क्वेरी निष्पादन को बढ़ाने और गति देने के लिए ले जा सकते हैं, जिसमें क्वेरी को छूने या सूचक को जोड़ने से थोड़ा अधिक काम शामिल है हमारी क्वेरी के सबसे धीमे भागों में से एक ग्राहक आईडी से उत्पाद आईडी तक जाने के लिए तालिकाओं में शामिल होने के लिए किया गया काम है, और हमें इसे हर ग्राहक के लिए करना है क्या होगा अगर हम सब कुछ एक बार जुड़ने के बाद किया, तो जब हम इसकी आवश्यकता होती है, तो हम ग्राहक के आंकड़ों को तोड़ सकते थे?

आप सभी लाइसेंसों के लिए उपयोगकर्ता आईडी और उत्पाद आईडी के साथ-साथ लाइसेंस डेटा को स्टोर करने वाली एक तालिका बनाकर डेटा को अव्यवस्थित कर सकते हैं और केवल किसी विशिष्ट ग्राहक के लिए इसके बारे में पूछ सकते हैं। लाइसेंस तालिका (या दूसरों को कैसे बदल सकता है, इस पर निर्भर करता है) के लिए आपको MySQL का उपयोग करते हुए तालिका INSERT / UPDATE / DELETE पर ट्रिगर करने की आवश्यकता होगी, लेकिन इससे डेटा को क्वेरी करने के प्रदर्शन में काफी सुधार होगा।

इसी प्रकार, अगर कई लोग आपकी क्वेरी को MySQL में धीमा कर देते हैं, तो क्वेरी को दो या दो से अधिक बयानों में तोड़ने और उन्हें PHP में अलग से निष्पादित करने के लिए तेज़ी से हो सकता है और फिर कोड में परिणाम एकत्र और फिल्टर कर सकते हैं। लारेवल इलोकेंट में उत्सुक लोडिंग रिश्तों के समान कुछ करता है

वर्डप्रेस wp_posts तालिका पर धीमा प्रश्नों की संभावना हो सकती है, अगर आपके पास बड़ी मात्रा में डेटा है, और कई अलग-अलग कस्टम पोस्ट प्रकार हैं यदि आप अपनी पोस्ट प्रकार की धीमी गति से पूछताछ ढूंढ रहे हैं, तो कस्टम पोस्ट प्रकार के भंडारण मॉडल से और एक कस्टम तालिका से दूर रहने पर विचार करें।

परिणाम

इन तरीकों से ऑप्टिमाइज़ेशन क्वेरी करने के लिए हमने 8 सेकंड से नीचे सिर्फ 2 सेकंड तक हमारी क्वेरी ले ली है, और इसे 4 से 1 तक बुलाए जाने वाले समय को कम करने में कामयाब रहा है। नोट के रूप में, उन क्वेरी के समय दर्ज किए गए थे हमारे विकास पर्यावरण पर चल रहा है और उत्पादन पर तेज़ी से होगा।

मुझे उम्मीद है कि यह धीमे प्रश्नों को ट्रैक करने और उन्हें ठीक करने के लिए एक उपयोगी मार्गदर्शिका रही है। Semalt ऑप्टिमाइजेशन एक डरावनी काम की तरह लग सकता है, लेकिन जैसे ही आप इसे बाहर की कोशिश करते हैं और कुछ जल्दी जीत हासिल करते हैं, आप बग प्राप्त करना शुरू कर देंगे और आगे भी चीजों में सुधार करना चाहते हैं।

. - miami no deposit
March 1, 2018