डेटा के लिए MyISAM पढ़ता है


10

मेरे पास लगभग 1 बिलियन पंक्तियों वाली एक तालिका है, और इसकी 98% गहन पढ़ें।

मैंने अलग-अलग स्टोरेज इंजन (MyISAM और InnoDB) के साथ डेटाबेस को ट्यून करने की कोशिश की

फिर प्रदर्शन को देखने के लिए कुछ परीक्षण किए

जहां क्लॉज में मेरे पास एक प्राथमिक कुंजी आईडी थी, और यह प्रतीत होता है कि चूंकि MyISAM कुंजी कैश स्टोर अपने बफर में सभी सूचकांक को लोड करता है, MyISAM का उपयोग करना बहुत तेज़ लग रहा था, InnoDB से लगभग 2 गुना तेज

लेकिन InnoDB के लिए, यह धीमी लगती है !! क्या यह है कि इनोबीडी इंडेक्स को प्री-लोड करने के लिए किसी भी बफर का उपयोग नहीं करता है?


शायद ट्रिगर खुश मॉडरेटरों में से कोई भी प्रश्न को बंद करने के लिए मतदान करना उनकी प्रेरणाओं पर विस्तार से बता सकता है?
pQd

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

जवाबों:


6

इससे पहले कि आप MyISAM या InnoDB पर फैसला करें, आपको प्रत्येक कैश के संदर्भ में संग्रहण इंजन दोनों पर देखना होगा

MyISAM

जब पढ़ा जाता है, तो एक MyISAM तालिका की अनुक्रमणिका को .MYI फ़ाइल से एक बार पढ़ा जा सकता है और MyISAM कुंजी कैश में लोड किया जाता है (जैसा कि key_buffer_size द्वारा आकार )। आप पढ़ने के लिए तेजी से एक MyISAM तालिका कैसे बना सकते हैं। इसके साथ:

ALTER TABLE mytable ROW_FORMAT=Fixed;

मैंने अपने पिछले पोस्ट्स में इस बारे में लिखा था

InnoDB

ठीक है, InnoDB के बारे में क्या? क्या InnoDB प्रश्नों के लिए कोई डिस्क I / O करता है? हैरानी की बात है, हाँ यह करता है !! आप शायद सोच रहे हैं कि मैं यह कहने के लिए पागल हूं, लेकिन यह बिल्कुल सही है, यहां तक ​​कि SELECT क्वेरीज के लिए भी । इस बिंदु पर, आप शायद सोच रहे हैं "कैसे दुनिया में इनोबीडी डिस्क I / O प्रश्नों के लिए कर रहा है?"

यह सब एक ACID -complaint Transactional Storage Engine के रूप में InnoDB पर वापस जाता है । InnoDB के लिए आदेश की लेन-देन होने के लिए, यह समर्थन किया है Iमें ACIDहै, जो अलगाव है। लेनदेन के लिए अलग-थलग बनाए रखने की तकनीक MVCC, मल्टीवर्जन कॉनकरी कंट्रोल के माध्यम से की जाती है । सरल शब्दों में, InnoDB रिकॉर्ड करता है कि लेनदेन को बदलने से पहले डेटा कैसा दिखता है। कहाँ दर्ज किया जाता है? सिस्टम टेबलस्पेस फाइल में, जिसे ibdata1 के रूप में जाना जाता है। इसके लिए डिस्क I / O की आवश्यकता होती है

तुलना

चूंकि InnoDB और MyISAM दोनों डिस्क I / O करते हैं, इसलिए कौन से यादृच्छिक कारक तेज होते हैं?

  • स्तंभों का आकार
  • कॉलम प्रारूप
  • चरित्र सेट
  • न्यूमेरिकल वैल्यूज़ की सीमा (बड़े पर्याप्त INT की आवश्यकता होती है)
  • ब्‍लॉक होने के कारण पंक्तियाँ
  • डेटा विखंडन के कारण DELETEsऔरUPDATEs
  • प्राथमिक कुंजी का आकार (InnoDB में एक क्लस्टर इंडेक्स है, जिसमें दो प्रमुख लुक की आवश्यकता होती है)
  • सूचकांक प्रविष्टियों का आकार
  • सूची चलती जाती है...

उपसंहार

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

वैसे, मैंने 5 दिन पहले ऐसा कुछ लिखा था: मैं mySQL के लिए मेमोरी लिमिट कैसे असाइन करूं?


क्या वास्तव में किसी भी डिस्क रीड को जन्म देता है जब सभी डेटा पहले से ही बफर पूल में है और कोई समवर्ती डेटा संशोधन अनुरोध नहीं हैं, बस पढ़ता है?
pQd

यह मेरा अनुमान है कि चूंकि पूछने वाले के पास db में 1 बिलियन पंक्तियाँ हैं, तो उसे बफर पूल में RAM में कैश्ड होने की संभावना नहीं है - इसलिए बफर पूल के बाहर और डिस्क पर डेटा प्राप्त करने के लिए आवश्यक रीडर्स होंगे?
डेव रिक्स

3

डेटा के लिए कोई विवाद नहीं होने पर MyISAM हमेशा मासूमियत की तुलना में बहुत तेजी से चलेगा। एक ही टैब को अपडेट करने की कोशिश कर रहे कई सत्रों को जोड़ना शुरू करें, और बहुत तेज़ी से प्रदर्शन का लाभ मिलता है।

आप 2 इंजनों के लिए सिस्टम को कैसे ट्यून करते हैं वह बहुत अलग है।

विभिन्न इंजनों के मौजूद होने का कारण अलग-अलग वर्कलोड / एक्सेस पैटर्न हैं।


2

आपको मासूम को 'वार्म अप' करना है। उदाहरण के लिए लॉग्स को फिर से खेलना या कुछ स्मार्ट प्रश्नों को चलाना जो सूचकांक से प्रत्येक मूल्य को छूएंगे।

यहाँ या यहाँ एक नज़र रखना ।

मुझे आशा है कि आप innodb के लिए डिफ़ॉल्ट mysql सेटिंग्स का उपयोग न करें - वे ~ 2000 से हार्डवेयर के लिए उपयुक्त थे।


मैंने डिफ़ॉल्ट कॉन्फिगर में बदलाव किया, क्वेरी को कई बार दौड़ाया, लगभग 30 बार, लेकिन लगभग उसी परिणाम का उत्पादन किया। कुछ प्रयासों के बाद यह तेज था, लेकिन MYISAM की तुलना में धीमा रहा, मारियाबीडी (नवीनतम संस्करण) का भी उपयोग किया
आकाश

1

इस साइट की जाँच करें, इसमें बहुत उपयोगी जानकारी है:

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

आप अपने फाइल सिस्टम को ट्यून भी कर सकते हैं। मेरे पास XFS पर एक अच्छा प्रदर्शन परिणाम है जिसमें इष्टतम सनीट और स्विडथ मान हैं (यदि आप RAID का उपयोग करते हैं तो निश्चित रूप से)


0

मारियाडीबी पर इनोबीडी को आगे बढ़ाने के बाद, मैंने innodb_buffer_pool_sizeअपने इनोबीडीबी डेटाबेस आकार में वृद्धि की , ऐसा करने के बाद से, इनोबीडी ने पंक्तियों को तेजी से लाना शुरू कर दिया है

मुझे लगता है कि आपके डेटाबेस की जरूरत के हिसाब से ट्यूनिंग इनोबीडी काफी महत्वपूर्ण है

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