चयन / INSERTs / अद्यतन / DELETE के बहुत सारे के लिए MySQL उच्च प्रदर्शन


9

मैं एक मॉड्यूल बना रहा हूं, जहां हर उपयोगकर्ता को अक्सर 10 से 300 सेकंड के लिए टेबल में रिकॉर्ड मिलता है।

जब समय समाप्त होता है एक रिकॉर्ड नष्ट हो जाता है। मामला यह है: बहुत सारे उपयोगकर्ता होंगे और रिकॉर्ड वास्तव में अक्सर बदलेंगे - यह इस तालिका के लिए आवेदन के प्रदर्शन को कैसे प्रभावित करेगा, क्योंकि रिकॉर्ड वास्तव में अक्सर बदल जाएंगे और मुझे आश्चर्य है कि क्या mysql इसके साथ ठीक है? जैसे सूचकांक आएंगे और जाएंगे, इस विशेष तालिका के लिए डेटा 200 गुना / सेकंड की तरह बदलता है। शायद मैं इस तरह की नौकरी के लिए एक बुरा समाधान चुन रहा हूं। कोई सुझाव ?

धन्यवाद!


2
क्या आपने मेमेचे में डेटा संग्रहीत करने की कोशिश की है और फिर इसे हर कुछ सेकंड में एक लेनदेन में फ्लश करें?

3
"डेटा इस विशेष तालिका के लिए 200 गुना / सेकंड की तरह बदल जाता है" मुझे लगता है कि इस डेटा को लाइन मंत्र को स्मृति में आयोजित किया जाना चाहिए, जिस जीवनकाल के लिए इसे जारी रखना है वह छोटा है इसलिए शायद डिस्क पर नहीं जाना चाहिए?

सूचकांक आते हैं और जाते हैं? मैं किसी भी कारण के बारे में नहीं सोच सकता कि आपको बहुत बार इंडेक्स बनाने और छोड़ने की आवश्यकता क्यों है।
बैरी ब्राउन

जवाबों:


3

एक बात पर ध्यान देना होगा कि MySQL अपने प्रमुख भंडारण इंजनों के लिए बफ़र्स का उपयोग कैसे करता है: InnoDB और MyISAM

मेमोरी में कैश्ड झूठ इन स्टोरेज इंजनों के बीच बहुत भिन्न होता है।

InnoDB डेटा और इंडेक्स पेज दोनों को कैश करता है। उन्हें InnoDB बफर पूल में लोड किया गया है, जो innodb_buffer_pool_size द्वारा आकार में है ।

MyISAM केवल इंडेक्स पेजों को कैश करता है और उन्हें Key Cache (Key Buffer) में लोड किया जाता है, जिसका आकार key_buffer_size है

InnoDB बफ़र पूल और MyISAM कुंजी कैश को सही ढंग से आकार देने के लिए आपको डेटा और इंडेक्स साइज़ को डिस्क पर कब्जे में लेने के लिए information_schema.tables का उपयोग करना होगा ।

आपके पास कितना डेटा है और आप कितने समय की अनुमति देंगे, इसके आधार पर, आप निम्नानुसार कैश को गर्म कर सकते हैं:

हर टेबल के लिए टेबलटी

  • प्रत्येक सूचकांक NDX को गोटो
  • प्रत्येक सूचकांक NDX के लिए
    • NDX में प्रत्येक स्तंभ का चयन करें , कम से कम एक स्तंभ तालिका में तालिका से अनुक्रमित नहीं है

ऐसा करने से आप गारंटी देते हैं कि हर डेटा और इंडेक्स पेज कम से कम एक बार पढ़ा जाता है। वे कैश में बैठेंगे। इस अवधारणा का अभ्यास, भाग में और सिद्धांत रूप में, पेरकोना द्वारा किया जाता है । पर्कोना ने इस कॉन्सेप्ट को mk-slave-prefetch में बनाया था । यह कार्यक्रम क्या करता है

  • एक गुलाम पर रिले लॉग पढ़ें गुलाम इसमें एसक्यूएल प्रसंस्करण करते हैं
  • रिले लॉग से एक SQL स्टेटमेंट लें और इसे WHECT, GROUP BY, और ORDER BY का उपयोग करते हुए अनुक्रमित चुनने के लिए एक गाइड के रूप में चुनें।
  • परिवर्तित SQL से आए चयन कथन को निष्पादित करें

यह गुलाम को एसक्यूएल को जल्दी से संसाधित करने के लिए 99.99% डेटा की आवश्यकता होती है। यह उस स्थिति में भी दास को तैयार करता है जिसे आप दास के लिए मैन्युअल रूप से विफल कर देते हैं और इसे एक मास्टर को बढ़ावा देते हैं, जो आपके पास केवल उन सामानों के बारे में है जो आपको कभी भी प्राप्त नहीं होते हैं।

निष्कर्ष

कुछ भी नहीं है जो आपको भारी INSERTS, UPDATE और DELETE के वातावरण में उपयोग करने के लिए तैयार, तैयार और सक्षम होने के लिए तैयार करता है।

कोशिश करो !!!

चेतावनी

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


5

यदि यह एक बुरा समाधान है तो कई चीजों पर निर्भर करेगा। क्या इस डेटा को लगातार बनाए रखने की आवश्यकता है? अन्यथा शायद एक समाधान जो इस डेटा को केवल स्मृति में रखता है बेहतर काम करेगा।

"बहुत सारे उपयोगकर्ता" वास्तव में किसी की मदद नहीं कर रहे हैं। MySQL सबसे अच्छा होगा यदि "बहुत" का अर्थ कुछ सैकड़ों होगा। (हालांकि आपके डेटाबेस को और क्या संभालना है इसके आधार पर। कई हजार को सबसे अधिक संभावना काम भी करना चाहिए।)

आखिरकार, इससे कोई फर्क नहीं पड़ता है, अगर आप कुछ सेकंड से मिनटों तक रहने या हटाने के लिए उन रिकॉर्ड को लिखते हैं। सिर्फ हटाने से एक से दो ऑपरेशन हो जाते हैं। और MySQL रिकॉर्ड बनाने और हटाने की एक बहुत बड़ी मात्रा को संभाल सकता है। सुनिश्चित करें कि आप हटाने के लिए उन रिकॉर्ड्स को खोजने के लिए एक सरल सूचकांक का उपयोग करते हैं।

लेकिन वास्तविक संख्या और हार्डवेयर के बारे में कुछ जानकारी के बिना जो आपके डेटाबेस सर्वर का उपयोग करता है, जिसका उत्तर बहुत सटीक रूप से नहीं दिया जा सकता है।

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

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


4
एक समाधान का सुझाव देने के लिए +1 जो डेटा को स्मृति में रखता है।

3

यहाँ एक पागल विचार है। इसमें मान्यताओं को शामिल किया गया है और हमेशा अनुशंसित प्रथाओं को शामिल नहीं किया जाता है (जैसे कि एक कुंजी को अपडेट करना) - मुझे यह सुझाव देने के लिए बहुत सारे नकारात्मक मिलेंगे, लेकिन यहां यह महत्वपूर्ण है ...

यह मानते हुए कि आपके पास बहुत अधिक मात्रा में पंक्तियां और हटाए जाने की मात्रा अधिक है, आप अपनी तालिका में 2 विभाजन बनाकर हटाए गए प्रदर्शन को बढ़ा सकते हैं। विभाजन कुंजी के पहले अंक से भिन्न होगा। उदाहरण:

मुख्य मूल्य 1123234441 सक्रिय पंक्तियों और कुंजी मूल्य के लिए है: 9123234441 निष्क्रिय पंक्तियों के लिए है (इस उदाहरण में पहला अंक निम्नानुसार है: 1 = सक्रिय, 9 = निष्क्रिय)।

अब जब उपयोगकर्ता एक पंक्ति हटाता है, तो आप पंक्ति को भौतिक रूप से नहीं हटाते हैं, आप कुंजी (Ouch!) को अपडेट करते हैं, यह स्वचालित रूप से पंक्ति को निष्क्रिय पंक्तियों के विभाजन में ले जाएगा।

बेशक, आपको केवल सक्रिय विभाजन से डेटा पढ़ने के लिए अपने चयन को प्रतिबंधित करने की आवश्यकता है। अब शांत भाग यह है कि निष्क्रिय पंक्तियों को गिराना अत्यंत त्वरित है।

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

अपने चयनों को बढ़ाने के लिए, उचित अनुक्रमण का उपयोग करें और आवेषण को बढ़ाने के लिए पंक्ति का आकार कम करें और अनुक्रमणिकाओं की संख्या (यह कथन बहुत ही सामान्य है ...)

एक संदर्भ के लिए देखें: http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html आशा है कि यह मदद करता है।


2
मुझे यकीन नहीं है, अगर यह इस विशिष्ट समस्या के लिए समझ में आता है (मेरा अनुमान अभी भी है, कि mysql पूरी चीज को कैश करेगा और सबसे अधिक संभावना है कि उन रिकॉर्ड को कभी भी डिस्क नहीं दिखाई देगी)। लेकिन एक दिलचस्प अनुकूलन तकनीक को इंगित करने के लिए +1 जो मुझे अब तक नहीं पता था।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.