बहुत सरल चयन प्रश्नों पर MySQL बेहद धीमा


10

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

उदाहरण के लिए, मेरे पास एक बहुत ही सरल टेबल होल्डिंग एड्रेस है:

CREATE TABLE `addresses` (
  `address_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) CHARACTER SET latin1 NOT NULL,
  `firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
  `street` varchar(64) CHARACTER SET latin1 NOT NULL,
  `housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
  `zip` varchar(5) CHARACTER SET latin1 NOT NULL,
  `city` varchar(64) CHARACTER SET latin1 NOT NULL,
  `email` varchar(64) CHARACTER SET latin1 NOT NULL,
  `phone` varchar(16) CHARACTER SET latin1 NOT NULL,
  `birthdate` date NOT NULL,
  PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

यह तालिका लगभग 800 प्रविष्टियाँ रखती है जो वास्तव में बहुत अधिक नहीं है। लेकिन क्वेरी चल रही है

SELECT * FROM addresses

परीक्षण के उद्देश्यों के लिए, यह कभी खत्म नहीं होता है। मैंने सर्वर पर mysql CLI के साथ इसकी जाँच की: यह तालिका की कुछ पंक्तियों को आउटपुट करता है और तब तक प्रतीक्षा करता है जब तक कि यह अगली पंक्तियों को आउटपुट न कर दे।

तो शायद यह डेटा भेजने के चरण में एक समस्या है, लेकिन मुझे यकीन नहीं है।

VM में 2GB RAM है और केवल 320MB का उपयोग किया जाता है। CPU भी बहुत कम 1 से 2% तक चलता है। mytop सर्वर को ब्लॉक करने वाले अन्य प्रश्नों को नहीं दिखाता है। आईटी व्यवस्थापक ने कहा कि उन्होंने हार्डवेयर पक्ष में कुछ भी नहीं बदला है।

मैंने पहले से ही डेटाबेस सर्वर को पुनरारंभ करने, वर्चुअल मशीन को पुनरारंभ करने जैसी कुछ चीज़ों की कोशिश की। कुछ भी मदद नहीं की।

संपादित करें:

EXPLAIN SELECT * FROM addresses

मुझे यह परिणाम देता है:

+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | addresses | ALL  | NULL          | NULL | NULL    | NULL |  793 |       |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

वर्चुअल बॉक्स, एक्सईएन या कुछ और? होस्ट डिस्क कैसे सेट की जाती है? क्या अन्य वीएम उसी बॉक्स पर भी धीमी गति से चल रहे हैं? उन सवालों के जवाब देने से उत्तर का पता चल सकता है
मैट

मैं हाइपरविजर का मालिक नहीं हूं, इसलिए मैं वास्तव में इसका जवाब नहीं दे सकता। मैंने पहले ही हाइपरविजर के व्यवस्थापक से पूछा कि क्या उन्हें किसी भी हाल के बदलाव के बारे में पता है, लेकिन उन्होंने कहा कि नहीं।
वर्जित

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

अच्छी बात है, मैंने अनुभव किया कि शायद यह एक mysql समस्या नहीं है। रनिंग mysql -u username -ppassword mydb -e 'SELECT * FROM addressesधीमी गति से आउटपुट हो रही है, लेकिन `> test.txt` को जोड़ना, यह बहुत तेज़ चलता है। अब यह शायद एक अलग सवाल होगा !? मैं इस पर कैसे जांच कर सकता हूं?
वर्जित

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

जवाबों:


13

यदि सीपीयू लोड कम है, तो यह इंगित करता है कि लापता अनुक्रमित के साथ कोई समस्या नहीं है, अगर ऐसा था तो क्वेरी को बस अधिक सीपीयू और डिस्क एक्सेस की आवश्यकता होगी। साथ ही आपने कहा कि इसने 3 साल तक काम किया।

क्या आपने सामान्य डिस्क एक्सेस गति (विशेष रूप से उस विभाजन पर जहां डेटाबेस स्थित है) की जांच की? जैसे dd यहाँ प्रयोग कर रहे हैं । आप एक मृत डिस्क या अर्ध-मृत छापे जैसी आवाज़ों का वर्णन कर रहे हैं। बैकअप मुझे आशा है?


ये एक अच्छा बिंदु है। यह मेजबान पर एक डिस्क त्रुटि के रूप में सरल रूप में कुछ हो सकता है।
मैट

9

आप कुछ चीजों की कोशिश कर सकते हैं,

  1. क्या आपके पास इंडेक्स सेटअप है?

अनुक्रमण एक पूर्ण तालिका स्कैन पहले किए बिना रिकॉर्ड को जल्दी से ढूंढना संभव बनाता है, नाटकीय रूप से निष्पादन के समय में कटौती करता है।

CREATE INDEX idx_name ON addresses(name);
  1. क्वेरी चलाने से पहले EXPLAIN कीवर्ड का उपयोग करें,

जब एक SELECT क्वेरी के सामने उपयोग किया जाता है, तो यह वर्णन करेगा कि MySQL क्वेरी को निष्पादित करने के लिए कैसे और पंक्तियों की संख्या को समाप्त करने से पहले इसे संसाधित करने की आवश्यकता है।

  1. अपने mysql.ini में कुछ बदलाव करें, यदि इसका VM रैम बढ़ाता है और प्रदर्शन बढ़ने पर यह देखने के लिए अपने mysql.ini को कॉन्फ़िगर करता है।

वहाँ कई MySQL ऑप्टिमाइज़र हैं जो आपको मार्गदर्शन कर सकते हैं।

इससे मदद मिलती है


ठीक है, लेकिन एक छोटी सी मेज (<800 पंक्तियों) पर एक इंडेक्स बनाना उतना उपयोगी नहीं लगता जितना मुझे चाहिए। ऊपर उद्धृत क्वेरी को समाप्त करने में एक मिनट से अधिक समय लगता है। इस तरह के एक छोटे से टेबल का पूरा टेबल स्कैन इतना लंबा नहीं होना चाहिए।
वर्जित

तो ... क्या आपने अनुक्रमणिका को जोड़ा? यदि आप सुनिश्चित नहीं हैं कि समस्या क्या है तो मैं बुनियादी काम शुरू कर दूंगा और अपने तरीके से काम करूंगा। इंडेक्स जोड़ने पर केवल प्रदर्शन बढ़ेगा यदि सही तरीके से किया गया हो।
एंथनी फोर्निटो 19

हां, मैंने नाम के कॉलम में एक इंडेक्स जोड़ा है। लेकिन मेरी उपरोक्त क्वेरी का कोई भी प्रतिबंध नहीं है, जहां इसे पूरा करना है, इसलिए इसे पूरी तालिका को पढ़ना होगा और इसे प्रिंट करना होगा। सूचकांक जोड़ा मदद नहीं की
वर्जित

मैंने ऊपर दिए गए EXPLAIN क्वेरी का परिणाम जोड़ा। यह मेरे लिए ठीक है, लेकिन प्रदर्शन अभी भी बहुत कम है। मैं RAM नहीं बढ़ा सकता क्योंकि मैं वर्चुअलाइजेशन मैनेजर का एडमिन नहीं हूं। लेकिन यह htopदर्शाता है कि 2050MB रैम में से केवल 307MB का उपयोग किया जाता है।
वर्जित

अनुक्रमणिका के बारे में आपको वास्तव में यह सोचने की ज़रूरत है कि किन स्तंभों को अनुक्रमणित करना है, आप सब कुछ अनुक्रमित नहीं करना चाहते हैं, उन लोगों को अनुक्रमणित करें जिनके पास सबसे बड़ी राशि है, मैं इस पर कुछ जंगली धारणाएं बना रहा हूं, लेकिन मैं पहले nameऔर 'firstname' के साथ शुरू करूंगा । दूसरा क्या आप सुनिश्चित हैं कि आपने सही तरीके से अनुक्रमण किया है? possible_keys: यदि NULL स्तंभ है, तो यह इंगित करता है कि कोई प्रासंगिक अनुक्रमणिका नहीं मिली।
एंथनी फोरनिटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.