2010-09-30 9 views
7

में मैं कस्टम उत्पाद के लिए mysql में सम्मिलन गति और प्रदर्शन पैटर्न के बारे में बेहतर समझ प्राप्त करने की कोशिश कर रहा हूं। मेरे पास दो टेबल हैं जिनके लिए मैं नई पंक्तियों को जोड़ता रहता हूं। दो तालिकाओं के रूप में निम्नानुसार परिभाषित कर रहे हैं:तालिका के रूप में प्रविष्टि की गति धीमी है क्योंकि mysql

CREATE TABLE events (
added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
id BINARY(16) NOT NULL, 
body MEDIUMBLOB, 
UNIQUE KEY (id)) ENGINE InnoDB; 

CREATE TABLE index_fpid (
fpid VARCHAR(255) NOT NULL, 
event_id BINARY(16) NOT NULL UNIQUE, 
PRIMARY KEY (fpid, event_id)) ENGINE InnoDB; 

और मैं दोनों तालिकाओं (प्रत्येक नई वस्तु के लिए, मैं एक लेन-देन दोनों तालिकाओं के लिए प्रासंगिक जानकारी डालने) करने के लिए नई वस्तुओं डालने रहते हैं। सबसे पहले, मुझे लगभग 600 प्रविष्टियां/सेकंड मिलती हैं, लेकिन ~ 30000 पंक्तियों के बाद, मुझे एक महत्वपूर्ण मंदी (लगभग 200 प्रविष्टियां/सेकंड) मिलती है, और फिर एक धीमी, लेकिन फिर भी ध्यान देने योग्य मंदी होती है।

मैं देख सकता हूं कि तालिका बढ़ने के साथ ही, आईओ प्रतीक्षा संख्या उच्च और उच्च हो जाती है। मेरा पहला विचार इंडेक्स द्वारा लिया गया स्मृति था, लेकिन वे एक वीएम पर किए जाते हैं जिसमें 768 एमबी है, और अकेले इस कार्य को समर्पित है (स्मृति का 2/3 उपयोग नहीं किया जाता है)। इसके अलावा, मुझे 30000 पंक्तियों को इतनी मेमोरी लेने में कठिनाई होती है, और भी अधिक सूचकांक (पूरे mysql डेटा dir < 100 एमबी वैसे भी)। इसकी पुष्टि करने के लिए, मैंने वीएम (64 एमबी) को बहुत कम स्मृति आवंटित की, और मंदी पैटर्न लगभग समान है (यानी मंदी की समान संख्या के बाद मंदी दिखाई देती है), इसलिए मुझे कुछ कॉन्फ़िगरेशन समस्याएं संदेह हैं, खासकर जब से मैं अपेक्षाकृत नया हूं डेटाबेस। alt text

मैं एक आत्म निहित अजगर स्क्रिप्ट जो मुद्दा reproduces, कि मैं उपलब्ध करा सकते हैं कि अगर मददगार है है:

पैटर्न के रूप में निम्नानुसार लग रहा है।

विन्यास:

  • उबंटू 10.04, 32 बिट केवीएम पर चल रहा है, 760 एमबी यह करने के लिए आवंटित।
  • Mysql 5.1, टेबल
  • के लिए अलग-अलग फ़ाइलों के साथ बॉक्स विन्यास से बाहर

[संपादित करें]

आप एरिक Holmberg करने के लिए बहुत-बहुत धन्यवाद, वह इसे किसी न किसी। Innodb_buffer_pool_size को उचित मान पर ठीक करने के बाद ग्राफ़ यहां दिए गए हैं: alt text

+0

समस्या, वर्चुअल या अन्यथा लिखने की क्षमता। –

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि आपका क्या मतलब है: मैं समझता हूं कि डिस्क पर लिखने में समय लगता है, लेकिन यह धीमा होने की व्याख्या नहीं करता है क्योंकि तालिका बढ़ती है। –

उत्तर

8

अपनी /etc/mysql/my.cnf फ़ाइल संपादित करें और सुनिश्चित करें कि आप इनो डीबी बफर पूल में पर्याप्त मेमोरी आवंटित करते हैं। यदि यह एक समर्पित सेवर है, तो आप शायद अपनी सिस्टम मेमोरी का 80% तक उपयोग कर सकते हैं।

# Provide a buffer pool for InnoDB - up to 80% of memory for a dedicated database server 
innodb_buffer_pool_size=614M 

प्राथमिक कुंजी बी पेड़ तो आवेषण हमेशा ओ (logn) समय लगेगा और एक बार आप कैश से बाहर चलाने के लिए, वे पागल की तरह गमागमन शुरू कर देंगे कर रहे हैं। जब ऐसा होता है, तो आप शायद अपनी प्रविष्टि गति को बनाए रखने के लिए डेटा को विभाजित करना चाहेंगे। विभाजन पर अधिक जानकारी के लिए http://dev.mysql.com/doc/refman/5.1/en/partitioning.html देखें।

शुभकामनाएं!

+0

वह था, बहुत बहुत धन्यवाद। मैं अंतर दिखाने के लिए ग्राफ अपडेट करूंगा, यह काफी हड़ताली है। विभाजन युक्ति के लिए धन्यवाद: मैं पहले से ही विभाजन में देख रहा था, लेकिन मैं पहले इस मुद्दे को समझे बिना वहां जाना नहीं चाहता था। –

+2

ग्राफ़ को अपडेट करने के लिए अतिरिक्त मील जाने के लिए धन्यवाद - दूसरा सेट शानदार दिखता है! –

1

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

Great link about insert speed.

ANALYZEOPTIMIZE

+0

केवल दो इंडेक्स हैं - प्राथमिक कुंजी, और एक अद्वितीय बाधा। जो दोनों अद्वितीय मूल्यों को लागू करते हैं। जब तक विलोपन नहीं होता है, तब तक बनाए रखने के लिए कुछ भी नहीं है। –

+0

मुझे नहीं लगता कि मैं इंडेक्स को अक्षम कर सकता हूं (मेरे आवेदन में, मुझे जैसे ही लिखे गए हैं, उन्हें आवेषण उपलब्ध कराने की आवश्यकता है, और आवेषण "रीयल-टाइम" में आते हैं, यह बैच प्रोसेसिंग नहीं है)। –

+0

मैं आपको ओएमजी पर भरोसा करता हूं, अगर आप कहते हैं कि मामला मैं उत्सुकतापूर्वक आपके उत्तर का इंतजार करता हूं ताकि मैं सीख सकूं। –

0

यह सत्यापित करना कि डालने में कोई महत्वपूर्ण बाधा का उल्लंघन नहीं होता है, और उस समय बढ़ता है क्योंकि तालिका बड़ी हो जाती है। यदि आप फ्लैट आउट प्रदर्शन में दिलचस्पी रखते हैं, तो LOAD DATA INFILE का उपयोग करके आपकी डालने की गति में काफी सुधार होगा।

+0

मुझे उम्मीद है कि तालिका बढ़ने के साथ धीमा हो जाएगा (इंडेक्स (एस) अपडेट की लॉग (एन) लागत की वजह से)। लेकिन अगर मैं iowait% पर विश्वास करता हूं, तो यहां मंदी की वजह आई है, और यह अप्रत्याशित है (क्योंकि मेरे पास एक डेटासेट है जो पूरी तरह से स्मृति में फिट होने के लिए काफी छोटा है)। इसके अलावा, मेरे ग्राफ एक लॉग (एन) धीमा नहीं दिखाते हैं। –

+0

यह कुछ दुर्लभ है कि आपका पूरा डेटासेट स्मृति में फिट होगा, लेकिन मुझे खुशी है कि आपकी समस्या हल हो गई है। यदि आपकी आवश्यकताएं हैं तो 'लोड डेटा इन्फाइल' अब भी आपको और प्रदर्शन सुधार दिखाएगा। –

संबंधित मुद्दे