MySQL में MEMORY स्टोरेज इंजन का उपयोग करने के लिए ** NOT ** क्या कारण हैं?


28

मुझे हाल ही में पता चला कि MySQL में एक "मेमोरी" इंजन है, जिसके बारे में मुझे जानकारी नहीं थी (मेरे डेटाबेस का ज्यादातर काम हॉबी प्रोजेक्ट्स के लिए है, इसलिए मुझे पता है कि मुझे जैसा चाहिए वैसा ही मिलता है)। ऐसा लगता है कि इस विकल्प से मुझे बहुत बेहतर प्रदर्शन करना चाहिए, इसलिए मुझे आश्चर्य है कि क्या कोई कमियां हैं जो इसके साथ जाती हैं। जो मैं जानता हूं वे दो हैं:

  1. मुझे प्रश्न में तालिका (ओं) को रखने के लिए पर्याप्त रैम की आवश्यकता है।
  2. यदि मशीन बंद हो जाती है, तो टेबल खो जाती हैं।

मेरा मानना ​​है कि # 1 एक मुद्दा नहीं होना चाहिए क्योंकि मैं AWS EC2 का उपयोग कर रहा हूं और यदि आवश्यक हो तो अधिक मेमोरी वाले इंस्टेंस प्रकार पर जा सकता है। मेरा मानना ​​है कि मैं आवश्यकतानुसार डिस्क पर वापस डंप करके # 2 को कम कर सकता हूं।

और क्या मुद्दे हैं? क्या मेमोरी इंजन कभी भी MyISAM या InnoDB से भी बदतर प्रदर्शन दे सकता है? मुझे लगता है कि मैंने कुछ पढ़ा है कि सूचकांक इस इंजन के साथ अलग हैं; क्या मुझे इस बारे में चिंता करने की ज़रूरत है?

जवाबों:


27

Http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html पर सुविधा उपलब्धता सूची को देखते हुए दो संभावित समस्याएं सामने आती हैं:

  1. कोई लेन-देन या एफके समर्थन नहीं है, जिसका अर्थ है कि आपको अपने स्वयं के कोड में लेन-देन की अखंडता और संदर्भात्मक अखंडता का प्रबंधन करना होगा (जो कि डीबी को आपके लिए ऐसा करने की तुलना में बहुत कम कुशल हो सकता है, हालांकि यह आपके ऐप पर निर्भर करता है अपेक्षित व्यवहार पैटर्न)।
  2. तालिका स्तर केवल लॉकिंग: यह स्केलेबिलिटी के लिए एक महत्वपूर्ण अवरोधक हो सकता है यदि आपके ऐप को कई समवर्ती लेखकों को तालिकाओं के एक ही सेट या ऐसे मामलों की आवश्यकता होती है जहां आपके रीड ऑपरेशन लगातार डेटा को पढ़ने के लिए ताले का उपयोग करते हैं - ऐसे मामलों में एक डिस्क आधारित तालिका जो बहुत बेहतर लॉक लॉक ग्रैन्युलैरिटी का बेहतर समर्थन करता है यदि इसकी पर्याप्त सामग्री वर्तमान में रैम में कैश की जाती है।

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

एक विकल्प हो सकता है:

  1. डिस्क आधारित तालिकाओं का उपयोग करें, लेकिन यह सुनिश्चित करें कि आपके पास किसी भी समय RAM में उन सभी को रखने के लिए पर्याप्त से अधिक RAM है (और "पर्याप्त RAM" आपके द्वारा मशीन, ओएस पर किसी भी अन्य प्रक्रियाओं को ध्यान में रखते हुए जितना आपको लगता है उससे अधिक हो सकता है) आईओ बफ़र्स / कैश और आगे)
  2. सामग्री को मेमोरी में प्रीलोड करने के लिए प्रत्येक स्टार्टअप पर तालिका की संपूर्ण सामग्री (सभी डेटा और इंडेक्स पेज) को स्कैन करें SELECT * FROM <table> ORDER BY <pkey fields>SELECT <indexed fields> FROM <table> ORDER BY <index fields>प्रत्येक सूचकांक के लिए निम्नलिखित तालिका के

इस तरह आपका सारा डेटा रैम में है, आपको केवल लिखने के संचालन के लिए I / O प्रदर्शन के बारे में चिंता करनी होगी। यदि आपके ऐप का सामान्य कामकाजी सेट पूरे DB की तुलना में बहुत छोटा है (जो कि आमतौर पर ऐसा होता है - अधिकांश अनुप्रयोगों में अधिकांश उपयोगकर्ता केवल सबसे हाल के डेटा को देख रहे होंगे यदि समय हो तो) आप कितना अधिक होने के बारे में अधिक चयनात्मक हो सकते हैं। आप मेमोरी में प्रीलोड करने के लिए स्कैन करते हैं, बाकी को डिमांड पर डिस्क से लोड करने की अनुमति देता है।


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

@ डोसा: यह मानते हुए कि सब कुछ क्रमबद्ध करने के बजाय समवर्ती पहुंच की अनुमति देता है, आप इसके लिए कुछ अखंडता प्रबंधन चाहते हैं।
डेविड स्पिल्ट

14

मेमोरी स्टोरेज इंजन का उपयोग नहीं करने के बहुत सारे मामले हैं - और जब InnoDB तेज़ होगा। आपको केवल संगामिति के बारे में सोचने की जरूरत है न कि तुच्छ एकल पिरोए गए परीक्षणों की।

यदि आपके पास एक बड़ा पर्याप्त बफर पूल है, तो InnoDB रीड ऑपरेशंस के लिए पूरी तरह से मेमोरी रेजिडेंट बन जाएगा। डेटाबेस में कैश हैं । वे खुद को गर्म करते हैं!

इसके अलावा - पंक्ति-स्तरीय लॉकिंग और MVCC (पाठकों को ब्लॉक नहीं करते हैं) के मूल्य को कम मत समझो । यह "धीमा" हो सकता है जब लिखते हैं कि डिस्क को जारी रखना है। लेकिन कम से कम आप उस लेखन ऑपरेशन के दौरान ब्लॉक नहीं करेंगे, जैसे आप एक मेमोरी टेबल (कोई MVCC; टेबल लेवल लॉकिंग) पर होंगे।


3

रिकार्ड के लिए। मैंने कुछ जानकारी संग्रहीत करने के लिए मेमोरी में मैसकल तालिकाओं का परीक्षण किया। और मैंने उसी जानकारी को संग्रहीत करने के लिए PHP के APC (APCu) का परीक्षण किया।

58000 रजिस्ट्रियों के लिए। (varchar + पूर्णांक + तिथि)।

  1. मूल स्वरूप 24mb पाठ प्रारूप (सीएसवी प्रारूप) में।
  2. PHP का APC 44.7mb RAM का उपयोग करता है।
  3. मैसूर की तालिका में 575mb RAM का उपयोग किया गया है।

तालिका में केवल एक ही सूचकांक है, इसलिए मुझे नहीं लगता कि यह मुख्य कारक है।

निष्कर्ष:

मेमोरी टेबल "बड़ी" टेबल का विकल्प नहीं है क्योंकि यह बहुत अधिक मेमोरी का उपयोग करता है।


2
यह एक बड़ा जवाब है। मेमोरी स्टोरेज इंजन को छोटे डेटा प्रकारों का उपयोग करके, स्पष्ट रूप से BTREE को इंडेक्स प्रकार के रूप में परिभाषित करके और रैम में लोड किए गए डेटा की मात्रा को सीमित करके ट्यून किया जा सकता है। यह अभी भी छोटे सेटों के लिए एक व्यवहार्य विकल्प है। आक्रामक डिस्क I / O जैसे अन्य कारक भी हैं। मेरी पोस्ट देखें dba.stackexchange.com/questions/6156/… और dba.stackexchange.com/questions/2868/… )
RolandoMySQLDBA

वास्तव में, मैंने सूचकांक को बदल दिया (और इसे पूरी तरह से हटा भी दिया) और आकार इतना नहीं बदला (खरोंच से तालिका का पुनर्निर्माण सहित)। IMHO मैसकल हुड के नीचे कुछ कर रहा है, किसी प्रकार का अनुकूलन हो सकता है या प्रति कॉलम सबसे बड़ा आकार आवंटित कर सकता है (जैसे कि एक varchar में)।
मैगलन

6
कारण लगभग निश्चित रूप से आपके VARCHAR के कारण है: "MEMORY tables use a fixed-length row-storage format. Variable-length types such as VARCHAR are stored using a fixed length." dev.mysql.com/doc/refman/5.6/en/memory-storage-engine.html प्रभावी रूप से ऐसा प्रतीत होगा कि VARCHAR MEMORY इंजन के साथ CHAR बन गया है।
मैथ्यू 1471

2

MEMORY- आधारित तालिकाओं का अन्य नुकसान यह है कि उन्हें एक ही क्वेरी में कई बार संदर्भित नहीं किया जा सकता है। कम से कम वह व्यवहार v5.4 तक पाया गया था। सीटीई के साथ कैसे (v8.x के बाद से) जटिल प्रक्रियाओं के लिए मेम-आधारित मध्यवर्ती तालिकाओं का उपयोग करने की आवश्यकता नहीं है।


1

MySQL और MariaDB मैनुअल के अनुसार, BLOB और CLOB (विभिन्न प्रकार के) मेमोरी स्टोरेज द्वारा समर्थित नहीं हैं। हमारे अपने उद्देश्यों के लिए, इसने मेमोरी स्टोरेज इंजन को लगभग बेकार कर दिया।

http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html

मेमोरी टेबल में BLOB या TEXT कॉलम नहीं हो सकते।

https://mariadb.com/kb/en/mariadb/memory-storage-engine/

वारीचर्स जैसे वैरिएबल-लेंथ प्रकारों का उपयोग मेमरी टेबल में किया जा सकता है। मेमोरी टेबल के लिए BLOB या TEXT कॉलम समर्थित नहीं हैं।

डेटाबेस के केवल भाग को मेमोरी स्टोरेज में बदलने की कोशिश करने पर, मैंने पाया कि इंटर-स्टोरेज इंजन विदेशी कुंजी समर्थित नहीं है। तो, सभी तालिकाओं, जिसमें तालिकाओं के लिए विदेशी कुंजी संदर्भ होना चाहिए, जिसमें BLOB / CLOB भी गैर-मेमोरी स्टोरेज प्रकारों में होना चाहिए (कम से कम, यह InnoDB चाइल्ड टेबल को प्रभावित करता है)।


1

मेमोरी टेबल लगातार स्टोरेज के लिए अभिप्रेत नहीं हैं, विशेष रूप से डेटा के बड़े उप-समूह या कुछ भी जहां प्रतिधारण महत्वपूर्ण है। मेरे अनुभव से उनका सबसे अच्छा उद्देश्य जटिल प्रक्रियाओं के दौरान अस्थायी टेबल के निर्माण और आबादी के दौरान घर में क्षणिक रिकॉर्ड है, जो इस उद्देश्य के लिए अन्य तालिका प्रकारों की तुलना में काफी तेजी से प्रदर्शन करता है, बशर्ते इंजन के लिए आपकी कुंजी बफर सीमा पर्याप्त नहीं है। एक डिस्क लिखें। यह इस उद्देश्य के लिए MyISAM या InnoDB से अधिक परिमाण का क्रम संचालित कर सकता है क्योंकि कोई डिस्क I / O नहीं है, और एक तालिका के मामले में जो एक विशिष्ट प्रक्रिया के भीतर एनकैप्सुलेटेड है, अनुक्रमण और संबंध उतना महत्वपूर्ण नहीं है जितना कि वे जहां दृढ़ता की उम्मीद की जाती है।


1

पिछले उत्तरों के अलावा। MySQL 5.7 मैनुअल से सीधे:

"मेमरी का प्रदर्शन अपडेट को संसाधित करते समय एकल-थ्रेड निष्पादन और टेबल लॉक ओवरहेड के परिणामस्वरूप विवाद से विवश होता है। लोड बढ़ने पर स्केलेबिलिटी सीमित हो जाती है, विशेष रूप से स्टेटमेंट मिक्स के लिए जिसमें लेखन शामिल है।"

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

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