MySQL INSERT और UPDATE प्रदर्शन में सुधार कैसे करें?


14

यह सवाल शायद StackOverflow पर भी पूछा जा सकता है, लेकिन मैं यहाँ पहले कोशिश करूँगा ...

हमारे डेटाबेस में INSERT और UPDATE कथनों का प्रदर्शन हमारे वेब ऐप में खराब प्रदर्शन और खराब प्रदर्शन का कारण बनता है।

टेबल्स InnoDB हैं और एप्लिकेशन लेनदेन का उपयोग करता है। क्या कोई आसान मोड़ है जो मैं चीजों को गति देने के लिए बना सकता हूं?

मुझे लगता है कि हम कुछ लॉकिंग मुद्दों को देख रहे हैं, मैं कैसे पता लगा सकता हूं?


Dba.stackexchange.com पर बेहतर
Pacerier

जवाबों:


25
  1. जांचें कि क्या आपका हार्डवेयर और OS ठीक से कॉन्फ़िगर और ट्यून है:

    • समस्या का स्रोत (CPU / IO / मेमोरी / स्वैप उपयोग)। क्या आपके पास बहुत सारे IOP हैं? सीपीयू भरी हुई हैं? यदि आपके पास बहुत कुछ पढ़ा है IOP है तो शायद आपके पास पर्याप्त बड़ा InnoDB बफर_पूल नहीं है। यदि सीपीयू भरी हुई है, तो संभवत: आपके प्रश्न उचित अनुक्रमित का उपयोग करने के बजाय पूर्ण तालिका स्कैन करते हैं।
    • डिस्क / RAID / LVM सेटअप। कुछ विशिष्ट सेटअपों में LVM स्ट्रिपिंग आपको डिस्क लोड (कोई हार्डवेयर RAID, एकाधिक LUNS कनेक्टेड) ​​को eqalizing द्वारा लाभ दे सकती है
    • IO अनुसूचक: जब आपके पास अच्छा हार्डवेयर RAID नियंत्रक होता है, तो शायद नूप सबसे अच्छा होता है। RedHat ने कुछ परीक्षण किए और उन्होंने कहा, कि Oracle (और अन्य DB) के लिए CFQ सबसे अच्छा विकल्प है। आपको कुछ बेंचमार्क (जैसे tpc-c या tpc-e) चलाने और चुनने की आवश्यकता है, जो आपके हार्डवेयर के लिए सबसे अच्छा है।
    • अच्छा फ़ाइल सिस्टम - ext3 डेटाबेस विशिष्ट वर्कलोड में अच्छा प्रदर्शन नहीं करता है। बेहतर XFS या OCFS2 है। आपको फिर से कुछ बेंचमार्क चाहिए।
    • देखो, अगर आपका सिस्टम स्वैप का उपयोग करता है। स्वैप का उपयोग mysql प्रदर्शन को नीचा दिखाता है
  2. जांचें, यदि आपका MySQL / InnoDB उदाहरण ठीक से ट्यून किया गया है:

    • बफ़र पूल आकार - मेमोरी में कैश डेटा पेज
    • innodb_flush_method = O_DIRECT - डबल IO बफरिंग से बचें
    • वृद्धि InnoDB लॉग फ़ाइल का आकार - गहन कार्यभार लिखने के लिए यह प्रदर्शन में सुधार कर सकता है। लेकिन याद रखें: बड़ा लॉग फ़ाइल आकार का अर्थ है क्रैश रिकवरी। कभी-कभी घंटों में !!!
    • innodb_flush_log_at_trx_commit = 0 या 2 - यदि आप ACID के बारे में चिंता नहीं कर रहे हैं और पिछले दूसरे या दो दिनों के लिए लेनदेन को ढीला कर सकते हैं।
    • key_buffer_size - MyISAM के लिए बहुत महत्वपूर्ण है, लेकिन इसका उपयोग डिस्क अस्थायी तालिकाओं के लिए किया जाता है।
    • अपना INNODB STATUS देखें
  3. अपने वर्कलोड का विश्लेषण करें - लॉग को धीमा करने और उस पर एमके-क्वेरी-डाइजेस्ट चलाने के लिए अपने सभी प्रश्नों को पकड़ें। आप tcpdump और maatkit का उपयोग करके सभी प्रश्नों को पकड़ सकते हैं
    • आपके अधिकांश सर्वर समय पर क्या प्रश्न लेते हैं?
    • क्या कोई अस्थायी टेबल बनाई गई है, विशेष रूप से बड़ी अस्थायी टेबल?
    • जानें, व्याख्या का उपयोग कैसे करें
    • क्या आपका आवेदन लेनदेन का उपयोग करता है? जब आप autocommit = 1 (MySQL के लिए डिफ़ॉल्ट) के साथ क्वेरी चलाते हैं, तो प्रत्येक इंसर्ट / अपडेट क्वेरी नए लेनदेन को शुरू करती है, जो कुछ ओवरहेड करते हैं। यदि यह संभव है, तो ऑटोकॉमिट को निष्क्रिय करना बेहतर है (अजगर में MySQL ड्राइवर ऑटोकॉमिट डिफ़ॉल्ट रूप से अक्षम है) और सभी संशोधनों के बाद मैन्युअल रूप से निष्पादित करें।
    • क्या आपका आवेदन एक ही टेबल में आवेषण की श्रृंखला को लूप में बनाता है? Load data infileआवेषण की श्रृंखला के लिए कमांड बहुत तेज है।
    • याद रखें: select count(*) from table;मायोसम की तुलना में निर्दोष के लिए बहुत धीमी है।
    • सर्वर समय के अधिकांश प्रकार के INSERT / UPDATE प्रश्न क्या हैं? उन्हें कैसे अनुकूलित किया जा सकता है?
    • जाँच करें, यदि आपके DB में उचित अनुक्रमित हैं और यदि आवश्यक हो, तो उन्हें जोड़ें।

हमारे वातावरण में हमारे पास स्थिति थी, कि एक प्रकार की अद्यतन क्वेरी धीमी थी। बैच की नौकरी खत्म करने का अनुमानित समय 2 दिन था !!! धीमी लॉग का विश्लेषण करने के बाद, हम पाते हैं कि इस प्रकार की अपडेट क्वेरी को पूरा करने के लिए 4 सेकंड की आवश्यकता होती है। प्रश्न इस तरह देखा गया update table1 set field1=value1 where table1.field2=xx table2.field3=yy and table2.field4=zz:। क्वेरी का चयन करने के लिए अद्यतन क्वेरी को परिवर्तित करने और उस चुनिंदा क्वेरी पर व्याख्या चलाने के बाद, हम पाते हैं कि इस प्रकार का क्वेरी इंडेक्स का उपयोग नहीं करता है। उचित इंडेक्स बनाने के बाद हमने अपडेट क्वेरी एक्जीक्यूशन टाइम को घटाकर मिलिसकॉन्ड और दो घंटे से भी कम समय में पूरा कर लिया था।

कुछ उपयोगी लिंक:


इससे पहले कि सूचकांकों की जाँच करें। डीग्रेडिंग एसएमईएल जैसे "टेबल बड़े हो जाते हैं क्योंकि हम सूचक नहीं हैं"।
टॉमटॉम

5

डिफ़ॉल्ट innoDB कॉन्फिगरेशन के साथ आप सीमित होंगे कि आप कितनी तेजी से डिस्क पर लेन-देन लिख सकते हैं और फ्लश कर सकते हैं। यदि आप थोड़ा ACID खोने से निपट सकते हैं, तो innodb_flush_log_at_trx_commit के साथ प्रयोग करें। लिखने के लिए 0 पर सेट करें और हर सेकंड के बारे में लॉग को फ्लश करें। हर कमिट पर लिखने और फ्लश करने के लिए 1 (डिफ़ॉल्ट) पर सेट करें। हर कमिट के बाद लॉग फाइल में लिखने के लिए 2 पर सेट करें लेकिन प्रति सेकंड केवल एक बार फ्लश करें।

यदि आप लेनदेन के 1s को खोने से निपट सकते हैं, तो यह लेखन प्रदर्शन को काफी हद तक सुधारने का एक शानदार तरीका हो सकता है।

इसके अलावा, ध्यान दें कि आपके डिस्क क्या कर रहे हैं। RAID 10> RAID 5 एक अतिरिक्त डिस्क की कीमत पर लिखते हैं।


1

कनेक्शन की स्थिति में लॉकिंग मुद्दों की जांच की जाएगी show full processlist;

my.cnfऔर MySQL प्रलेखन के माध्यम से पढ़ें । कॉन्फ़िगरेशन विकल्प बहुत अच्छी तरह से प्रलेखित हैं।

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

ट्यूनिंग आपके पसंदीदा डेटाबेस इंजन और एप्लिकेशन आर्किटेक्चर के लिए विशिष्ट होने जा रहा है। पहले से मौजूद इंटरनेट खोज में पर्याप्त संसाधन मौजूद हैं।



0

InnoDB एक बहुत अच्छा इंजन है। हालाँकि, यह 'ट्यून्ड' होने पर निर्भर करता है। एक बात यह है कि यदि आपकी आवेषण प्राथमिक कुंजियों को बढ़ाने के क्रम में नहीं हैं, तो innoDB MyISAM से थोड़ा अधिक समय ले सकता है। यह एक उच्च innodb_buffer_pool_size सेट करके आसानी से दूर किया जा सकता है। मेरा सुझाव है कि इसे अपने कुल RAM का 60-70% पर सेट करें। मैं अब उत्पादन में 4 ऐसे सर्वर चला रहा हूं, जो एक मिनट में लगभग 3.5 मिलियन पंक्तियों को सम्मिलित करता है। उनके पास पहले से ही करीब 3 टेराबाइट्स हैं। अत्यधिक समवर्ती आवेषण के कारण, InnoDB यह होना चाहिए था। आवेषण को गति देने के और तरीके हैं। और मैंने कुछ बेंचमार्किंग की है।


0

मैं वेब एप्लिकेशन में MySQL में इन्सर्ट और अपडेट परफॉर्मेंस मुद्दों को कैसे हल करता हूं, बस एक बार जावा में ऑटो-कमिट और कमिटेड चेंजेस को डिसेबल करके। जैसा कि mysql प्रलेखन में सुझाया गया है।

MySQL डॉक्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.