मेमोरी में कैश MySQL डेटाबेस


11

मुझे 600MB MySQL डेटाबेस वाली वेबसाइट में समस्या हो रही है। वेबसाइट बहुत धीमी है। मैंने देखा कि जितना बड़ा MySQL डेटाबेस मिलता है, उतना ही धीमा हो जाता है। जब यह 5 एमबी था, तब वेबसाइट बहुत तेज थी। जब यह बड़ा होने लगा तो यह धीमा और धीमा होने लगा और अब, 600MB पर, यह वास्तव में धीमा है, पृष्ठों को लोड करने में 10 सेकंड लगते हैं।

मैंने शीर्ष प्रक्रियाओं की जाँच की और यह उच्च भार या किसी भी चीज़ से संबंधित नहीं है। यह IOPS से संबंधित नहीं है जैसा कि मैंने HDD 7.2k rpm ड्राइव पर परीक्षण किया था और इसने Intel 320 SSD ड्राइव के साथ परीक्षण में अब वही समस्या दी है, इसलिए मुझे नहीं लगता कि यह उच्च प्रश्नों के बारे में है।

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

मेरे पास 16GB रैम और i5-2400 4 कोर @ 3.1 GHz है। ओएस सेंटोस 5.7 है

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached

जवाबों:


10

अगर मैं तुम होते, तो मैं सभी डेटा को InnoDB में बदल देता। टेबल लॉकिंग / पंक्ति लॉकिंग पर लंबे समय से कई लोगों ने चर्चा की है। मैं हमेशा InnoDB हाथ नीचे का चयन करेंगे। हालाँकि, InnoDB ... CACHING चुनने का एक और गहरा कारण है

जबकि अधिकांश लोग यह दावा करते हैं कि MyISAM पढ़े जाने के लिए तेज़ है, अधिकांश लोग यह भूल जाते हैं कि MyISAM के लिए कई कैश, जिसे कुंजी कैश (key_buffer_size द्वारा सेट) कहा जाता है, केवल .MYI फ़ाइलों से इंडेक्स पेजों को कैश करता है। यह डेटा पेज को कभी कैश नहीं करता है। 32-बिट सिस्टम में इसकी आधिकारिक अधिकतम 4GB है। 8-बिट 64-बिट के लिए अधिकतम अधिकतम है।

InnoDB बफर पूल डेटा और इंडेक्स पेजों को कैश करता है। आपके पास जो सर्वर है, उसके आधार पर आप रैम में संपूर्ण डेटासेट को कैश कर सकते हैं। आप इनोबीडी को 80% रैम और 10% तक डीबी कन्वेंशन के लिए ट्यून कर सकते हैं, और ओएस के लिए 10% छोड़ सकते हैं। यह अलग-अलग ऑपरेटिंग सिस्टम के लिए भी सही है

मैंने ड्रुपल ग्राहकों के लिए इन चीजों की शानदार सफलता की सिफारिश की है। यह Wordpress पर भी लागू होता है । मैंने वर्डप्रेस के साथ ग्राहकों के लिए DB समर्थन प्रदान किया है। एक ही सुधार।

आप हमेशा InnoDB के लिए मेमोरी को अधिक प्रभावी ढंग से कॉन्फ़िगर कर सकते हैं कि आप अधिक MyISAM कर सकते हैं। हमेशा अपनी प्रदर्शन आवश्यकताओं के अनुरूप इनोवीडी को ट्विवेक करने का एक तरीका है । जैसे-जैसे आपका डेटा बढ़ता जाएगा, यह अंततः एक आवश्यकता बन जाएगा ।

अद्यतन 2011-11-21 11:44 ईएसटी

यदि आपका संपूर्ण डेटासेट छोटा है, तो आप mysql शुरू होने के बाद अपने पास मौजूद हर टेबल पर एक सेलेक्ट क्वेरी को निष्पादित कर सकते हैं।

InnoDB और / या MyISAM वाली सभी तालिकाओं के लिए, यह क्वेरी चलाएँ:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

यह आपके द्वारा चलाने के लिए आवश्यक हर संभव क्वेरी को आउटपुट करेगा जो संदर्भित किए जाने वाले सभी अनुक्रमों को समन करेगा। इस क्वेरी को /root/MakeSelectQueriesToLoad.sql नामक फ़ाइल में रखें। स्क्रिप्ट चलाएँ और आउटपुट /root/SelectQueriesToLoad.sql इकट्ठा करें। अंत में, इसे चलाएं:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

यह निश्चित रूप से सभी इंडेक्स पेजों को InnoDB बफर पूल और MyISAM कुंजी कैश में लोड करेगा। यदि आपका सारा डेटा InnoDB है, तो दो बदलाव करें:

  • के WHERE engine IN ('InnoDB','MyISAM')साथ बदलेंWHERE engine='InnoDB'
  • के CONCAT('SELECT ',ndxcollist,' FROM ',साथ बदलेंCONCAT('SELECT * FROM ',

यह भी अधिक डेटा पृष्ठों को InnoDB बफर पूल में आबाद करेगा।

अंतिम नोट: सुनिश्चित करें कि InnoDB बफर पूल आपके सभी InnoDB डेटा को रखने के लिए पर्याप्त है


2

आप पहले से ही पूरे डेटाबेस को स्मृति में कैशिंग कर रहे हैं। समस्या लगभग निश्चित रूप से डेटाबेस को खोजने में लगने वाला समय है, यहां तक ​​कि रैम में भी।

अपनी डिस्क I / O आँकड़े देखें। आप शायद देखेंगे कि डिस्क I / O का कभी-कभार रैंडम बिट है। डेटाबेस है स्मृति में। यह समस्या नहीं है। आपको iostatपहले स्थापित करने की आवश्यकता है । आप अपने प्लेटफ़ॉर्म या वितरण का उल्लेख नहीं करते हैं, लेकिन यह संभवतः एक पैकेज में कहा जाता है iostat। आपको atopअधिक मिलनसार मिल सकता है ।

क्या जिन लोगों ने आपको बताया कि ऐसा कोई सबूत मिलने के बाद करते हैं कि आपका पूरा डेटाबेस पहले से ही मेमोरी में नहीं था या डिस्क I / O की समस्या थी? अन्यथा, उनकी सलाह एक डॉक्टर के बराबर है, जिसने आपको कभी नहीं देखा या जांच नहीं की है, लेकिन बस सुना है कि आपके हाथ ने आपको चोट लगने के बारे में बताया है।


-1

Wordpress के लिए एक अच्छा कैशिंग प्लगइन स्थापित करें, यह मदद कर सकता है। लेकिन जल्द या बाद में आपको उस अड़चन का पता लगाना होगा जो आपके सिस्टम को धीमा कर देती है।

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