क्या सेट करने के लिए innodb_buffer_pool और क्यों ..?


20

मेरे पास 170GB InnoDBइंडेक्स और डेटा है।

मुझे बेहतर प्रदर्शन के लिए innodb_buffer_pool आकार को फिर से पढ़ना होगा। एक InnoDB तालिका (सूचकांक + डेटा) की अधिकतम तालिका का आकार 28GB है।

तो innodb_buffer_pool का इष्टतम आकार क्या होना चाहिए।

अपडेट करें

हम अपने इस स्थानीय डेटाबेस को ec2 पर माइग्रेट करने जा रहे हैं, इसलिए RAM को innodb के वर्तमान आँकड़ों के अनुसार सेट करेंगे, इसीलिए मुझे बफ़र पूल के आकार की आवश्यकता है ताकि हम वहां RAM उपलब्ध कर सकें।

फ़ाइल प्रति तालिका सक्षम है।

मैं लिनक्स मशीन का उपयोग कर रहा हूं।


अन्य प्रक्रियाओं द्वारा मशीन पर उपलब्ध रैम का उपयोग नहीं किया जा रहा है? क्या आप विंडोज, लिनक्स या कुछ और का उपयोग कर रहे हैं? MySQL के किस संस्करण का आप उपयोग कर रहे हैं? टेबल का आकार 28GB तक सीमित क्यों है?
क्रेग एफ्रेइन

तालिका का आकार सीमित नहीं है..मैंने एक समय तक तालिका का आकार दिया है। यह भविष्य में आवेषण के रूप में बढ़ेगा ..
अब्दुल मनफ

जवाबों:


25

आपके पास सबसे बड़ी तालिका कुल डेटा का 16.47% (28/170) है। यहां तक ​​कि अगर तालिका अत्यधिक लिखित और अत्यधिक पढ़ी गई थी, तो तालिका के सभी 28 जी को एक ही समय में बफर पूल में लोड नहीं किया जाता है। आपको क्या गणना करने की आवश्यकता है कि वर्तमान DB सर्वर पर किसी भी समय InnoDB बफर पूल का कितना लोड होता है

यहाँ एक नया DB सर्वर के लिए innodb_buffer_pool_size निर्धारित करने के लिए अधिक दानेदार तरीका है जो वर्तमान में DB DB सर्वर के InnoDB बफर पूल में लोड किए गए डेटासेट को देता है।

अपने वर्तमान MySQL इंस्टेंस पर सर्वर चलाएँ (जिस सर्वर से आप माइग्रेट कर रहे हैं)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

सूत्र को चलाएं IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

अगर IBPPctFull 95% या उससे अधिक है, तो आपको DB सर्वर के RAM का 75% innodb_buffer_pool_size सेट करना चाहिए।

यदि IBPPctFull 95% से कम है, तो यह सूत्र चलाएँ IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05:।

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

IBPSize (जीबी में) की संख्या वह संख्या है जो आपके वास्तविक कामकाजी डेटासेट को अधिक बारीकी से फिट करती है।

अब, अगर IBPSize अभी भी सबसे बड़े अमेज़ॅन EC2 RAM कॉन्फ़िगरेशन के लिए बहुत बड़ा है, तो Amazon EC2 DB सर्वर के लिए 75% RAM का उपयोग करें।


यह वास्तव में बहुत अच्छी जानकारी है..एक और बात मुझे यह जानने की जरूरत है कि MySQL सर्वर बफर पूल में डेटा और इंडेक्स को कैसे लोड करता है, मैं प्रलेखन के माध्यम से चला गया और यह पाया कि यह LRU का उपयोग करता है लेकिन यह कैसे उन्हें मेमोरी में लोड करता है जैसे कि मेरे पास 2GB है बफर पूल लेकिन क्वेरी में अनुरोध की गई तालिका का आकार इससे बहुत अधिक है .. ??
अब्दुल मनफ

केवल क्वेरी को संतुष्ट करने के लिए आवश्यक डेटा और इंडेक्स पेज बफर टेबल में लोड किए गए हैं, न कि पूरी टेबल। पुराने डेटा और इंडेक्स पेजों को dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMySQLDBA

अब्दुल, आपको रोलांडो के उत्तर के साथ जाना चाहिए जो आपके प्रश्न का उत्तर मेरे मुकाबले बेहतर देता है। मैं अपने स्वयं के उत्तर को फिर से लिखने जा रहा हूं क्योंकि मुझे स्पष्ट होने की आवश्यकता है।
क्रेग एफ्रेइन

13

मैं नीचे रॉलैंडो के उत्तर के पूरक जानकारी के रूप में यह उत्तर प्रदान कर रहा हूं।

इससे पहले कि सर्वर उत्पादन में है

सबसे बड़ी तालिका के आधार पर innodb_buffer_pool_size की गणना करें जो अक्सर MySQL द्वारा उपयोग की जाती हैं। डेटाबेस में उनके आकार के आधार पर सबसे बड़ी तालिकाओं की पहचान करने के लिए आप इस स्क्रिप्ट का उपयोग कर सकते हैं:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

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

यहां छवि विवरण दर्ज करें

तो इस बात को ध्यान में रखते हुए, अब मुझे पता है कि उपयोगकर्ता और बोली टेबल लगभग 640MB डिस्क स्थान लेते हैं, वे जेपी के अनुसार बहुत बार उपयोग किए जाते हैं और इसका मतलब है कि MySQL बफर पूल में रॉलेंडो के रूप में अपने अनुक्रमित और डेटा को संग्रहीत करने जा रहा है। उनकी टिप्पणियों में नीचे उल्लेख है।

यह सुनिश्चित करने के लिए कि MySQL के पास मेरे सबसे बड़े और सबसे अधिक उपयोग किए जाने वाले तालिकाओं के लिए डेटा स्टोर करने के लिए पर्याप्त मेमोरी है, मैं फिर 640MB पर innodb_buffer_pool_size को परिभाषित करूंगा।

कुछ अतिरिक्त विचार हैं, लेकिन वे innodb_buffer_pool_size पर लागू नहीं होते हैं।

क्या यह 32 बिट या 64 बिट सिस्टम है? 32Bit सिस्टम में, आप 4GB तक सीमित हैं जब तक आप PAE को सक्रिय नहीं करते हैं। विंडोज में, इसका मतलब है विंडोज एंटरप्राइज या डेटासेंटर एडिशन चलाना।

आपके सिस्टम पर चलने वाली अन्य प्रक्रियाओं को कितनी मेमोरी की आवश्यकता है? एक समर्पित MySQL सर्वर पर, मैं ओएस के लिए 5% और 10% के बीच छोड़ दूंगा। विंडोज में आप मेमोरी उपयोग का विश्लेषण करने के लिए प्रोसेस एक्सप्लोरर का उपयोग कर सकते हैं। लिनक्स में, आपके पास sysstat, free, htop, top और vmstat है।

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

सर्वर उत्पादन के बाद है

Innodb के लिए वर्तमान हिट अनुपात क्या है?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)।

प्रमुख कैश हिट अनुपात क्या है

1 - (Key_reads / Key_read_requests)

मैं आमतौर पर 100% के करीब अनुपात प्राप्त करने का प्रयास करता हूं।

बफर पूल में आपकी टेबल कितनी अच्छी तरह फिट होती हैं

आप इस लिंक का हवाला देकर यह भी देख सकते हैं कि आपका बफर डेटा आपके बफर_पूल में कितना फिट बैठता है, जो यह दर्शाने का एक तरीका प्रदान करता है कि "कितने टेबल दिए गए टेबल (cnt) के लिए बफर पूल में हैं, उनमें से कितने गंदे हैं (गंदे) , और इंडेक्स का कितना प्रतिशत मेमोरी में फिट होता है (fit_pct)। " पेरकोना सर्वर पर ही लागू होता है

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

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