Drupal डेटाबेस innodb या MyISAM?


10

मेरे पास एक Drupal साइट है, और मैं प्रदर्शन के मुद्दों को भुगत रहा हूं। मैंने पाया कि मैं MyISAM से InnoDB में एक डेटाबेस कैसे परिवर्तित करूं? संकेत है कि स्विच करने से प्रदर्शन में सुधार हो सकता है।

मैं कैसे बता सकता हूं कि मेरा MySQL डेटाबेस InnoDB है, या MyISAM?


1
तालिका प्रकार कैटलॉग से बंधा नहीं है। आप इसमें MyISAM और InnoDB तालिकाओं के मिश्रण के साथ एक कैटलॉग रख सकते हैं।
mpdonadio

2
जबकि उस स्तर पर अनुकूलन के लाभ हैं, मुझे अत्यधिक संदेह है कि तालिका प्रकार बदलने से आपके प्रदर्शन के मुद्दे ठीक हो जाएंगे। अंतर सिर्फ इतना बड़ा नहीं है।
१ion:५० बजे सुस्ती २ Let

1
@ क्रिस जे ली, यह सही है। मिक्सिंग टेबल प्रकारों का उपयोग प्रदर्शन कारणों से किया जा सकता है, या केवल एक विशेष टेबल प्रकार के लिए उपलब्ध सुविधाओं का फायदा उठाने के लिए (जैसे, FULLTEXT खोज w / MyISAM टेबल)। यह भी दुर्घटना से भी हो सकता है अगर आप mysqld चूक बदल सकते हैं और एक सूची में :) अधिक टेबल बना
mpdonadio

2
सुस्ती: यह सिर्फ सादा गलत है। तालिका प्रकार और उनके लिए mysql को जिस तरह से कॉन्फ़िगर किया गया है, उसका प्रदर्शन पर बहुत प्रभाव पड़ता है!
वाल्टर हेक

2
@ लॉथेरियन: वास्तव में, वास्तु सुधारों को छोड़ दें, तो मिश्रित चयन और अद्यतन के साथ संगणना जैसी चीजों के मामले में बहुत बड़ा प्रदर्शन लाभ-एक अद्यतन MyISAM में एक तालिका को बंद कर देगा, लेकिन केवल InnoDB में एक पंक्ति - मतलब है कि विशाल प्रदर्शन बढ़ सकता है तालिका के इंजन को बदलने के अलावा और कुछ नहीं देखा जा सकता है। अब, यदि आप एक मूर्खतापूर्ण क्वेरी कर रहे हैं, तो आप एक मूर्खतापूर्ण क्वेरी कर रहे हैं, और तालिका प्रकार बदलने से कोई मदद नहीं मिलेगी। लेकिन बदलते इंजनों को हाथ से खारिज करना भी उतना ही गलत है।
BMDan

जवाबों:


8

आप एक कस्टम क्वेरी चला सकते हैं:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

अपने डेटाबेस में सभी तालिकाओं और प्रत्येक के लिए उपयोग होने वाले इंजन को सूचीबद्ध करने के लिए।

वैकल्पिक रूप से आप phpMyAdmin का उपयोग करके अपने डेटाबेस में प्रवेश कर सकते हैं और अपने डेटाबेस का चयन कर सकते हैं ... आप Typeतालिका की सूची में कॉलम में इंजन देखेंगे ।

व्यक्तिगत रूप से मैं MySQL के लिए Navicat की सिफारिश करूंगा , यह एक बहुत ही अच्छा MySQL GUI है और यह बहुत आसान जैसी चीजों का पता लगाता है।

स्रोत: http://www.electrictoolbox.com/mysql-table-storage-engine/


पुराने MySQL प्रशासक उपकरण भी इस तरह की चीजों के लिए अच्छी तरह से काम करता है। यदि आप MySQL वेबसाइट पर चारों ओर प्रहार करते हैं तो आप अभी भी इंस्टॉलर पा सकते हैं।
mpdonadio

@MPD वाह क्या अभी भी चल रहा है? डाउनलोड करना होगा कि भले ही सिर्फ पुरानी यादों की :) एक बिट के लिए
क्लाइव

व्यवस्थापक और क्वेरी ब्राउज़र अब आधिकारिक तौर पर पदावनत और असमर्थित हैं, लेकिन आप अभी भी उन्हें डाउनलोड कर सकते हैं। मैं कार्यक्षेत्र से नफरत करता हूं, और अभी भी इन का उपयोग करता हूं।
mpdonadio

कमांड लाइन पर phpMyAdmin में आपने जो देखा, उसके समान आउटपुट को देखने के लिए उपयोग करें SHOW TABLE STATUS। प्रत्येक इंजन प्रकार में कितने टेबल हैं, इसकी सरल गणना करने के लिए SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE
BMDan

6

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

(संपादित करें: कृपया नीचे टिप्पणी देखें)

आपके MySQL सेटअप पर भी निहितार्थ हैं, जिसके आधार पर आप DB का उपयोग कर रहे हैं। यदि आपके पास सर्वर तक पहुंच है, तो कॉन्फ़िगरेशन की जांच करने के लिए mysqltuner आपका पहला कदम होना चाहिए:

https://github.com/rackerhacker/MySQLTuner-perl#readme


2
+1, मुझे नहीं पता था कि Myo के लिए पूर्व उच्च प्रदर्शन समूह प्रबंधक के इस लेख केCOUNT अनुसार InnoDB प्रश्नों के लिए धीमा था , हालांकि यह वास्तव में केवल एक खंड के बिना युक्त क्वेरी को प्रभावित करता है । COUNT(*) WHERE
क्लाइव

3
कारण यह है कि MyISAM तालिका में पंक्तियों की संख्या के लिए प्रति-तालिका मान रखता है, जिसका अर्थ है कि एक साधारण SELECT COUNT(*) FROM tableउस मूल्य के साथ तुरंत वापस आ सकता है। InnoDB नहीं है, इसलिए इसे पूरे प्राथमिक कुंजी सूचकांक को स्कैन करना होगा। कहा कि द्रुपाल बहुत कुछ करता है SELECT COUNT(*), मैं पूरे कोड में केवल एक जगह के बारे में सोच सकता हूं जो इसे बिना किसी WHEREखंड के करता है । इस प्रकार, इस विशेष edgecase के लिए चिंता से बाहर MyISAM का उपयोग न करें। एक सभ्य आकार बफर पूल के साथ InnoDB सभी वास्तविक दुनिया के प्रश्नों के लिए तेज़ होगा।
BMDan

6

वेब साइट को तेज़ी से प्राप्त करने के लिए बस चीजों को आज़माना नेत्रहीन कारों को बदलने की तरह है और आशा है कि आप अगली बार और तेज़ हो जाएंगे।

पहले कम लटके फलों को आज़माएं, अगर यह मदद नहीं करता है, तो असली अड़चन खोजने की कोशिश करें।

  1. क्या आपने बिल्ट इन मेकेनिज्म: पेज कैशिंग (केवल अनाम उपयोगकर्ताओं के लिए प्रभावी), सीएसएस और जेएस एग्रीगेशन को चालू किया?
  2. यदि आपका होस्ट APC की तरह एक opcode कैश प्रदान करता है, तो इसे चालू करें।
  3. पूर्ण डीबी सहित अपना ड्रुपल लोकल सेट करें।
  4. सुनिश्चित करें कि आपके पास XDebug चल रहा है।
  5. वास्तविक प्रदर्शन प्रोफाइलिंग करना शुरू करें। इस तरह से आप पहचान सकते हैं कि आपकी वेबसाइट के किस हिस्से में बहुत समय लगता है। अपनी वेबसाइट को धीमा करने के लिए दोषी कोड / घटक को ढूंढना आसान है।

अक्सर यह सिर्फ एक धीमी डीबी क्वेरी होती है जिसमें एक इंडेक्स, या धीमी गति से काम करने वाले मॉड्यूल की आवश्यकता होती है।

मैंने हॉस्टलर्स के बीच बड़े अंतर का भी पता लगाया। यदि आप बॉक्स के बाहर एक नया ड्रुपल स्थापित करते हैं, तो प्रदर्शन ठीक है? यदि नहीं, तो यह दूसरे होस्ट के लिए देखने का समय है।


5

FWIW हमारी लगभग 20K नोड Drupal 6.x साइट कुछ प्रदर्शन मुद्दों का अनुभव कर रही थी और मैंने सभी तालिकाओं को InnoDB में स्थानांतरित करने का चुनाव किया। यह आसान था और जिस तरह से मैंने इसे हैंडल किया था वह एक sql फ़ाइल की सभी सामग्री को डंप करने के लिए mysqldump का उपयोग करना था, एक संपादक (sed) का उपयोग करके MyISAM की सभी घटनाओं को InnoDB में बदलने के लिए फिर उस फ़ाइल से डेटाबेस को पुनः लोड करें। नीचे के पक्षों में से एक यह है कि आप एक InnoDB डेटाबेस (IIRC) से जगह नहीं पा सकते हैं, लेकिन जब तक आप अपने डुप्लिकेट टेबल को एक अलग DB में रखते हैं, आपको कोई समस्या नहीं होनी चाहिए। ओह, और हमने एक महत्वपूर्ण प्रदर्शन वृद्धि देखी। और क्योंकि हमारे पास चार ड्रुपल इंस्टेंस हैं, फ़ाइल सिस्टम से तालिका फ़ाइलों की सरासर संख्या को समाप्त कर दिया गया था (हाँ, वे खुद इनोबीडी फ़ाइल के अंदर समाहित हैं)। यह मेरा $ .02 मूल्य है।


2
एक एकल InnoDB टेबलस्पेस होने से आप इनकोड को बचा सकते हैं, लेकिन (जैसा कि आप खुद का उल्लेख करते हैं) डिस्क स्थान की कीमत पर। यदि आप बहुत अधिक डेटा हटाते हैं, तब भी आप उस डिस्क स्थान को पुनः प्राप्त नहीं कर पाएंगे। यह भी अनावश्यक बड़ी बैकअप फ़ाइलों और एकल तालिकाओं को पुनर्स्थापित करने में सक्षम नहीं होने के परिणामस्वरूप। इसलिए मैं innodb_file_per_tableविकल्प का उपयोग करना पसंद करता हूं ।
जियूविज

1
इसके अलावा, आप टेबल को जगह में बदल सकते हैं for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done:। यदि आवश्यक हो तो -uroot -psomepassदोनों के लिए उपयुक्त विकल्प ( उदाहरण के लिए) mysqlजोड़ें।
BMDan

5

बिलकुल चौकन्ना। यदि आपका Drupal 6 पर है, तो आप DBTuner मॉड्यूल स्थापित कर सकते हैं ; यह आसानी से MyISAM से InnoDB तक अपनी टेबल ले जा सकता है। तो हाँ, इसके लिए एक मॉड्यूल है!

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