यह देखते हुए कि हमारा डेटाबेस हमारे लाइव प्रोडक्शन सिस्टम पर एक बड़ी बाधा बन गया है, मैंने इस मुद्दे के निचले हिस्से तक पहुंचने के लिए एक सरल बेंचमार्क बनाने का निर्णय लिया।इनो डीबी बोटलनेक: प्रदर्शन में सुधार करने के लिए एसीआईडी को आराम देना
बेंचमार्क: मैं समय-समय पर एक इनो डीबी तालिका में एक ही पंक्ति को बढ़ाने में कितना समय लगता हूं, जहां पंक्ति को इसकी प्राथमिक कुंजी से अनुक्रमित किया जाता है, और अपडेट किया जा रहा कॉलम किसी भी इंडेक्स का हिस्सा नहीं है। मैं रिमोट मशीन पर चल रहे 20 समवर्ती ग्राहकों का उपयोग करके इन 3000 अपडेट्स का प्रदर्शन करता हूं, जिनमें प्रत्येक डीबी से अलग कनेक्शन होता है।
मुझे सीखने में दिलचस्पी है कि क्यों मैंने विभिन्न स्टोरेज इंजनों को बेंचमार्क किया, इनो डीबी, माईसाम, और मेमोरी, उनके पास प्रोफ़ाइल है। मैं यह भी समझने की उम्मीद कर रहा हूं कि तुलना में इनो डीबी किराए इतनी खराब क्यों है।
इनो डीबी (20 समवर्ती ग्राहक): प्रत्येक अद्यतन 0.175 लेता है। सभी अपडेट 6.68 के बाद किए जाते हैं।
माईसाम (20 समवर्ती ग्राहक): प्रत्येक अपडेट 0.003s लेता है। सभी अपडेट 0.85 के बाद किए जाते हैं।
मेमोरी (20 समवर्ती ग्राहक): प्रत्येक अपडेट में 0.0019s लगते हैं। सभी अपडेट 0.80 के बाद किए जाते हैं।
यह सोचकर कि समेकन इस व्यवहार का कारण बन सकता है, मैंने एक क्लाइंट को अनुक्रमिक रूप से 100 अपडेट करने का भी बेंचमार्क किया।
इनो डीबी: प्रत्येक अपडेट में 0.0026s लगते हैं।
माईसाम: प्रत्येक अपडेट 0.0006s लेता है।
स्मृति: प्रत्येक अपडेट 0.0005s लेता है।
वास्तविक मशीन एक अमेज़ॅन आरडीएस उदाहरण (http://aws.amazon.com/rds/) ज्यादातर डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ है।
मुझे लगता है कि उत्तर निम्न पंक्तियों के साथ होगा: प्रत्येक अपडेट के बाद InnoDB fsyncs (चूंकि प्रत्येक अपडेट एक एसीआईडी अनुपालन लेनदेन है), जबकि माईसाम ऐसा नहीं करता है क्योंकि यह लेनदेन का समर्थन भी नहीं करता है। माईसाम शायद स्मृति में सभी अपडेट कर रहा है, और नियमित रूप से डिस्क पर फ्लश कर रहा है, इस प्रकार इसकी गति मेमरी स्टोरेज इंजन तक पहुंचती है। यदि ऐसा है, तो क्या इसके लेनदेन समर्थन के लिए इनो डीबी का उपयोग करने का कोई तरीका है, लेकिन शायद कुछ बाधाओं (कॉन्फ़िगरेशन के माध्यम से) को आराम दें ताकि कुछ स्थायित्व की कीमत पर लिखने को तेज़ी से किया जा सके?
इसके अलावा, ग्राहकों की संख्या के रूप में InnoDB के प्रदर्शन को बेहतर बनाने के तरीके के बारे में कोई सुझाव भी बढ़ता है? यह अन्य स्टोरेज इंजनों की तुलना में स्पष्ट रूप से खराब है।
अद्यतन
मैं https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance पाया है, जो मैं के लिए ठीक क्या देख रहा था। Innodb-flush-log-at-trx-commit = 2 सेट करने से हमें एसीआईडी बाधाओं को आराम करने की अनुमति मिलती है (डिस्क पर फ़्लशिंग प्रति सेकंड एक बार होता है) जहां बिजली विफलता या सर्वर क्रैश होता है। यह हमें माईसाम के लिए एक समान व्यवहार देता है, लेकिन हमें अभी भी इनो डीबी में उपलब्ध लेनदेन सुविधाओं से लाभ होता है।
समान बेंचमार्क चलाना, हम लेखन प्रदर्शन में 10x सुधार देखते हैं।
InnoDB (20 समवर्ती ग्राहकों): प्रत्येक अद्यतन 0.017s लेता है। सभी अपडेट 0.98 के बाद किए जाते हैं।
कोई अन्य सुझाव?
MyISAM नहीं डिजाइन एसिड शिकायत कर रहा है। InnoDB है। यदि आप बाधाओं को आराम देते हैं, तो यह अब एसीआईडी अनुपालन नहीं कर रहा है, और आप भी innodb का उपयोग नहीं कर सकते हैं। –
आप * लेनदेन का उपयोग कर रहे हैं ... सही? जब एक लेन-देन InnoDB को पूरा करता है * * एसीआईडी में ["डी" की गारंटी के लिए हार्डवेयर फ्लश करना चाहिए (http://en.wikipedia.org/wiki/ACID#Durability)। यहां तक कि तेजी से एसीआईडी डीबी ** मानक "स्पिंडल डिस्क पर लगभग 30-50 * लेनदेन */सेकंड ** तक सीमित हैं। (हालांकि, हजारों * अपडेट */सेकेंड प्राप्त करना मुश्किल नहीं है। एक अंतर है।) –
यह सच है, हमें पूर्ण एसीआईडी अनुपालन की आवश्यकता नहीं है। लेकिन, अगर हम लेनदेन अलगाव जैसी सुविधाओं के लिए एसीआई (नहीं डी) का कमजोर रूप चाहते हैं तो क्या होगा? चूंकि हमारा डेटा बहुत संवेदनशील नहीं है, और हम मल्टी-एजेड के साथ अमेज़ॅन आरडीएस का उपयोग करते हैं, दुर्लभ क्रैश और पावर विफलता हमारे लिए चिंता नहीं करती है। – BrainCore