Wp_options तालिका के लिए धीमी क्वेरी


16

मैं WP आधारित साइट के धीमी क्वेरी लॉग को ट्रैक कर रहा हूं ( एक long_query_time के डिफ़ॉल्ट मान के साथ 10 पर सेट), और मैंने देखा है कि निम्नलिखित क्वेरी अक्सर लॉग हो रही है -

# User@Host: root[root] @ localhost []
# Query_time: 0  Lock_time: 0  Rows_sent: 394  Rows_examined: 458
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

मुझे समझ नहीं आ रहा है कि इतनी छोटी टेबल को अमल करने में इतना समय कैसे लग सकता है। क्या यह सिर्फ किसी अन्य समस्या का लक्षण है? (वर्तमान में एक समर्पित VM पर Moodle, phpbb और WP चला रहे हैं)।

जवाबों:


16

अद्यतन : जिस कारण से क्वेरी को लॉग किया जा रहा है वह इंडेक्स का उपयोग नहीं करता है । क्वेरी समय 0 है, अर्थात यह वास्तव में तेजी से निष्पादित करता है। यदि आप लॉग इन नहीं करना चाहते हैं तो आप "लॉग-क्वेरीज़-नॉट-यूज़िंग-इंडेक्स" विकल्प को परेशान कर सकते हैं।

Wp_options तालिका में ऑटोलॉड पर कोई सूचकांक नहीं है, इसलिए क्वेरी पूर्ण तालिका स्कैन कर रही है। सामान्य तौर पर उस तालिका को बहुत बड़ा नहीं होना चाहिए, इसलिए यह कोई समस्या नहीं है, लेकिन मैं अनुमान लगा रहा हूं कि यह आपके मामले में किसी तरह हुआ है।

एक इंडेक्स जोड़ने से समस्या का समाधान हो सकता है, लेकिन जैसा कि TheDeadMedic ने टिप्पणियों में बताया है, यह नहीं हो सकता है कि ऑटोलैड के मान या तो बहुमत के हों, या समान रूप से हां और ना के बीच वितरित किए गए हों:

पहले यह देखें कि वितरण कैसा दिखता है:

SELECT COUNT(*), autoload FROM wp_options GROUP BY autoload;

अगर उनमें से अधिकांश बहुमत 'नहीं' पर सेट हैं, तो आप ऑटोलैड पर एक इंडेक्स जोड़कर इस समस्या का समाधान कर सकते हैं।

ALTER TABLE wp_options ADD INDEX (`autoload`);

हालाँकि, आप शायद इस बात की तह तक जाना चाहते हैं कि उस तालिका को बहुत बड़ा क्यों मिला है। संभवतः कुछ बुरी तरह से लिखे गए प्लगइन कुछ गड़बड़ कर रहे हैं।


2
मुझे संदेह है कि इस मामले में एक सूचकांक किसी भी लाभ की पेशकश करेगा - कार्डिनलिटी पर इस लेख की जांच करें ।
TheDeadMedic

निर्भर करता है कि अधिकांश विकल्प ऑटोलैड पर सेट हैं या नहीं। मुझे नहीं लगता, लेकिन तालिका में कभी भी इतना बड़ा नहीं होना चाहिए ताकि कुछ गड़बड़ हो जाए।
विनय पई

1
मैंने मूल्यों के वितरण की जाँच करने के बारे में थोड़ा जोड़ने के लिए उत्तर द्वारा अद्यतन किया।
विनय पई

1
मैंने सिर्फ टिप्पणी पर ध्यान दिया, और महसूस किया कि मेरा उत्तर पूरी तरह से गलत है। क्वेरी वास्तव में धीमी नहीं है ... यह सिर्फ धीमी क्वेरी लॉग में लॉग इन किया जा रहा है क्योंकि यह एक इंडेक्स का उपयोग नहीं करता है।
विनय पई

1
इस प्रश्न और उत्तर के लिए धन्यवाद मुझे पता चला कि मैंने अपनी wp_options तालिका में 90k प्रविष्टियां की थीं, जिनमें से 88.5k को ऑटोलैड झूठी के लिए सेट किया गया था। बाकी सभी प्लगइन्स द्वारा जोड़े गए "क्षणिक" प्रविष्टियां थीं (संभवतः कैशिंग के लिए?)। ऑटोलॉड कॉलम में एक इंडेक्स जोड़ने से मेरा mysql लोड औसतन 89% से 2.5% तक तुरन्त गिर गया। मॉनिटरिंग एजेंट बताते हैं कि मेरी साइट का प्रतिक्रिया समय 1900ms से घटकर 500ms हो गया है। यह मेरे लिए एक गेमचेंजर था।
मोर्ड्रेड

5

मैं कुछ दिनों पहले अपने सर्वर पर चलने वाले mytop में उल्लिखित क्वेरी के पार पहुंच गया था - और यह वास्तव में प्रत्येक क्वेरी के लिए काफी समय (लगभग 10 सेकंड) ले लिया था! तो वास्तविक दुनिया की स्थितियां हैं जहां wp_options समस्याग्रस्त आकार तक बढ़ सकते हैं। मेरे मामले में मुझे संदेह है कि कैचिंग प्लगइन Cachify को wp_options को ब्लोट करने के लिए जिम्मेदार माना जाता है।

इस विशेष wp_options का डेटा:

5,309 rows
130MB of data

एक समाधान के रूप में, मैंने विनय पै द्वारा पोस्ट किए गए समाधान के समान सूचकांक को जोड़ा, जिसने समस्या को निर्दोष रूप से हल किया।


1

मेरी wp_options तालिका में केवल डेटा की 235 पंक्तियाँ थीं। मैंने मेज को अनुक्रमित करने की कोशिश की, लेकिन यह मदद नहीं की।

पता चलता है कि लगभग 150 क्षणिक विकल्प तालिका में डाले गए थे, लेकिन स्वचालित रूप से हटाए नहीं गए थे।

मुझे नहीं पता कि यह संबंधित है या नहीं, लेकिन मैं अपनी /var/log/apache2/access.log फ़ाइलों के माध्यम से देख रहा हूं और देखा है कि कई (संभवतः समझौता किए हुए) अमेज़न वेब सेवा सर्वर (आईपी पते 54 से शुरू होते हैं। XXX और 32.XXX) /~web-root-dir/xmlrpc.php शोषण करने का प्रयास कर रहा था।

कुछ समस्या निवारण के बाद, मैंने "नामांतर" वाले विकल्प के नामों के लिए wp_options तालिका को समझा।

wp_options में से * का चयन करें जहां विकल्प_नाम जैसे '% क्षणिक %';

इस क्वेरी से लौटाए गए क्षेत्रों में से एक 'विकल्प_वायु' है जिसमें लोंगटैप्ट का डेटाटाइप है। MySQL डॉक्स के अनुसार, एक LONGTEXT फ़ील्ड (प्रत्येक पंक्ति के लिए) में 4-गीगाबाइट डेटा हो सकता है।

जब मैंने क्वेरी को निष्पादित किया, तो कुछ पंक्तियों (याद रखें कि "क्षणिक" वाले लोगों के साथ काम कर रहे थे) के पास ऑप्शन_वल्यू क्षेत्र में बड़े पैमाने पर डेटा था। परिणामों के माध्यम से, मैंने यह भी देखा कि क्रोन चक्र (एस) के दौरान निष्पादित होने वाली आशाओं के साथ wp-cron प्रक्रिया में कमांड को इंजेक्ट करने के प्रयासों की तरह क्या देखा।

मेरा समाधान सभी "क्षणिक" पंक्तियों को हटाना था। इससे सर्वर को चोट नहीं पहुंचेगी क्योंकि "क्षणिक" पंक्तियाँ स्वचालित रूप से फिर से खुल जाएंगी (यदि वे वहां होना चाहिए)।

ऐसा करने के बाद, सर्वर एक बार फिर उत्तरदायी था।

इन पंक्तियों को हटाने का प्रश्न:

Wp_options से DELETE जहाँ '% transient %' जैसे option_name ;

मैंने अपने फ़ायरवॉल पर AWS IP पता / 8 सुपरब्लॉक भी जोड़ा है (-:


हां। मैं "40 सेकंड लोड समय" से पीड़ित था, जब तक मुझे पता चला कि मेरे पास 20,000 wp_option रिकॉर्ड थे, जिसमें बड़े पैमाने पर डेटा हर एक पृष्ठ के साथ लोड किया जा रहा था। उन लोगों को हटाने से साइट पर काफी असर पड़ा।
जेसनजेनएक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.