2012-05-21 12 views
34

मैंने देखा कि मेरा डेटाबेस सर्वर मेमोरी डेटाबेस इंजन का समर्थन करता है। मैं एक डेटाबेस बनाना चाहता हूं जिसे मैंने पहले ही प्रदर्शन के लिए स्मृति में पूरी तरह से चल रहा है InnoDB चलाया है।मैं एक MySQL डेटाबेस को स्मृति में पूरी तरह से कैसे चला सकता हूं?

मैं यह कैसे कर सकता हूं? मैंने PHPMyAdmin की खोज की, और मुझे "चेंज इंजन" कार्यक्षमता नहीं मिल रही है।

+3

आपको पहले समझना चाहिए कि आप वहां क्या कर रहे हैं। मेमोरी इंजन का उपयोग करने से कुछ प्रभाव पड़ते हैं। – usr

+2

मेमोरी में चलने का मतलब है कि जैसे ही आप MySQL डिमन (या यह क्रैश) को पुनरारंभ करते हैं, डेटा मिटा दिया जाता है, तो आप MySQL के लिए query_cache के साथ खेलना बेहतर होगा या कैशिंग परिणामों के लिए memcached – Mikey

+1

मुझे यकीन नहीं है कि यह वही है तुम्हें चाहिए। आपकी प्रदर्शन समस्या वास्तव में क्या है? – Mario

उत्तर

18

मान लें कि टिप्पणियों में उल्लिखित मेमोरी इंजन का उपयोग करने के परिणामों और here के साथ-साथ कुछ अन्य लोगों को आप खोज कर पाएंगे (कोई लेनदेन सुरक्षा, लॉकिंग समस्याएं इत्यादि) - आप निम्नानुसार आगे बढ़ सकते हैं :

मेमोरी टेबल इनो डीबी की तुलना में अलग-अलग संग्रहीत किए जाते हैं, इसलिए आपको निर्यात/आयात रणनीति का उपयोग करने की आवश्यकता होगी। सबसे पहले प्रत्येक तालिका को SELECT * FROM tablename INTO OUTFILE 'table_filename' का उपयोग करके फ़ाइल में अलग से डंप करें। मेमरी डेटाबेस बनाएं और उन वाक्यों को फिर से बनाएं जिन्हें आप इस वाक्यविन्यास के साथ उपयोग करेंगे: CREATE TABLE tablename (...) ENGINE = MEMORY;। फिर आप प्रत्येक तालिका के लिए LOAD DATA INFILE 'table_filename' INTO TABLE tablename का उपयोग करके अपना डेटा आयात कर सकते हैं।

+0

क्या डाउनवॉटर टिप्पणी करने की देखभाल करेगा? – PinnyM

+29

कहीं भी यह वास्तव में यह नहीं कहता कि मेमोरी डेटाबेस या तालिका में कैसे बनाया जाए। –

+8

@INTPnerd द्वारा बनाए गए बिंदु पर, तालिकाओं को पुनर्निर्माण करते समय, वाक्यविन्यास का उपयोग करें: 'तालिका को कुछ योग्य बनाएं (...) इंजन = स्मृति; ' – PinnyM

5

यदि आपका डेटाबेस पर्याप्त छोटा है (या यदि आप पर्याप्त मेमोरी जोड़ते हैं) तो आपका डेटाबेस प्रभावी ढंग से स्मृति में चलाएगा क्योंकि आपका डेटा पहले अनुरोध के बाद कैश किया जाएगा।

मेमोरी इंजन का उपयोग करने के लिए डेटाबेस तालिका परिभाषाओं को बदलना शायद आपकी अपेक्षा से अधिक जटिल है।

यदि आपके पास MEMORY इंजन के साथ मेमोरी में टेबल लोड करने के लिए पर्याप्त स्मृति है, तो आपके पास सब कुछ कैश करने के लिए innodb सेटिंग्स को ट्यून करने के लिए पर्याप्त है।

9

मेमोरी इंजन वह समाधान नहीं है जिसे आप ढूंढ रहे हैं। आप पहले स्थान पर डेटाबेस में गए सब कुछ खो देते हैं (यानी एसीआईडी)।

यहाँ कुछ बेहतर विकल्प हैं:

  1. का प्रयोग न करें मिलती है - बहुत कुछ बड़े ऐप्स को इस (यानी गूगल, फ्लिकर, Netflix) करते हैं, क्योंकि यह मिलती है के बड़े सेट के लिए बेकार है।
  2. सुनिश्चित करें कि जिन कॉलम के खिलाफ आप पूछ रहे हैं वे इंडेक्स हैं। इसका उपयोग करने के लिए EXPLAIN का उपयोग करें।
  3. अपनी अनुक्रमणिका के लिए अपनी क्वेरीरी_Cache और मेमोरी स्पेस का उपयोग करें और उन्हें स्मृति में लाने और लगातार लुकअप स्टोर करने के लिए करें।
  4. विशेष रूप से सरल जुड़ने के लिए अपनी स्कीमा को अस्वीकार करें (यानी बारमैप से fooId प्राप्त करें)।

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

मुझे आशा है कि वे मदद करें।

+9

वह अंतिम बिंदु प्रदर्शन के लिए बहुत अच्छा हो सकता है, लेकिन यदि डेटा ठीक से उपयोग नहीं किया जाता है तो यह डेटा स्थिरता और रखरखाव के लिए एक हत्यारा हो सकता है। ट्रिगर अपडेट या इसी तरह की कैश प्रतिकृति रणनीतियों की मदद कर सकते हैं, लेकिन denormalized डेटा कैशिंग के तरीके को मंजूरी के लिए नहीं लिया जाना चाहिए ... – PinnyM

+3

@PinnyM अच्छा बिंदु। यह वह जगह है जहां किसी को यह तय करना होगा कि सबसे महत्वपूर्ण क्या है। आरडीबीएमएस परमाणुता और स्थिरता के लिए बहुत अच्छे हैं, लेकिन स्केलिंग और प्रदर्शन के लिए नहीं, जुड़ने पर esp। 6 एनएफ (स्टार स्कीमा) बहुत सामान्य है, लेकिन खुश हो जाओ। आप डेटा को सामान्य रूप से कुछ तालिकाओं में रख सकते हैं और सामान्यीकृत तालिकाओं (पढ़ने/लिखने) से denormalized (केवल पढ़ने के लिए) टेबल को अद्यतन करने के लिए ट्रिगर्स और अनुसूचित कार्यों का उपयोग कर सकते हैं। –

+1

1 और 4 अब तक की सबसे बुरी सलाह है। – Darwin

2

मेमोरी स्टोरेज इंजन के स्थान पर, कोई MySQL क्लस्टर पर विचार कर सकता है। ऐसा कहा जाता है कि समान प्रदर्शन दिया जाता है लेकिन स्थायित्व के लिए डिस्क-समर्थित ऑपरेशन का समर्थन करने के लिए कहा जाता है। मैंने कोशिश नहीं की है, लेकिन यह आशाजनक लग रहा है (और कई सालों से विकास में रहा है)।

You can find the official MySQL Cluster documentation here.

4

"मैं ऐसा कैसे कर सकता हूँ? मैं PHPMyAdmin का पता लगाया है, और मैं एक नहीं मिल सकता है" परिवर्तन इंजन "कार्यक्षमता।"

अपने प्रश्न के इस हिस्से के लिए सीधी प्रतिक्रिया में, आप एक ALTER TABLE tbl engine=InnoDB; जारी कर सकते हैं और यह उचित इंजन में तालिका पुन: करेंगे।

12

यह भी एक में MySQL डेटा निर्देशिका जगह के लिए संभव है tmpfs इस प्रकार डेटाबेस लिखने को तेज करने और पढ़ने के कॉल में। यह ऐसा करने के लिए सबसे कारगर तरीका नहीं हो सकता है, लेकिन कभी कभी तुम सिर्फ भंडारण इंजन नहीं बदल सकते हैं।

यहाँ मेरी MySQL डेटा के लिए मेरी fstab प्रविष्टि है निर्देशिका

none   /opt/mysql/server-5.6/data tmpfs defaults,size=1000M,uid=999,gid=1000,mode=0700   0  0 

मैंने एक पोस्ट भी लिखा जो सेटअप को और विस्तार से बताता है। मैं डेटाबेस परीक्षण के लिए इस सेटअप का उपयोग करें।

http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/

तुम भी innodb_flush_log_at_trx_commit = 2 सेटिंग पर एक नज़र लेने के लिए कर सकते हैं। शायद यह आपके MySQL को पर्याप्त रूप से तेज़ी से बढ़ाएगा।

innodb_flush_log_at_trx_commit mysql डिस्क फ्लश व्यवहार को बदलता है। जब 2 पर सेट किया जाता है तो यह केवल हर दूसरे बफर को फ्लश करेगा। डिफ़ॉल्ट रूप से प्रत्येक सम्मिलन एक फ्लश का कारण बनता है और इस प्रकार अधिक आईओ लोड का कारण बनता है।

+0

आप libeatmydata पर भी एक नज़र डालना चाहते हैं। यह fsync और पुरानी सिंक कॉल को रोकता है और इस प्रकार एप्लिकेशन को तेज़ करता है। https://www.flamingspork.com/projects/libeatmydata/ (apt-get eatmydata स्थापित करें; eatmydata पुनः आरंभ /etc/init.d/mysql) – Jotschi

+0

मैं के बारे में सोच रहा हूँ स्मृति और एक अन्य में पूरे mysql है mysql उदाहरण डेटा को दोहराने और बनाए रखने के लिए। बेशक, यह मानते हुए कि मैं ढीले डेटा के जोखिम से निपट सकता हूं क्योंकि प्रतिकृति विलंब। –

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