क्या लगातार क्वेरी कैश का ओवरहेड इसके लायक है?


22

मैं वर्तमान में एक MySQL डेटाबेस पर काम कर रहा हूं, जहां हम क्वेरी कैश से बड़ी संख्या में अमान्य देख रहे हैं, मुख्य रूप से INSERT, DELETE और UPDATE कथनों की अधिक संख्या के कारण जिन्हें कई तालिकाओं पर निष्पादित किया जा रहा है।

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

क्या बार-बार होने वाले अवैध कब्जे का मूल्य अधिक है?

संपादित करें: नीचे उपयोगकर्ता @RolandoMySQLDBA के अनुरोध पर, यहाँ MyISAM और INNODB की जानकारी दी गई है।

InnoDB

  • डेटा का आकार: 177.414 जीबी
  • सूचकांक का आकार: 114.792 जीबी
  • तालिका का आकार: 292.205 जीबी

MyISAM

  • डेटा का आकार: 379.762 जीबी
  • सूचकांक आकार: 80.681 जीबी
  • टेबल का आकार: 460.443 जीबी

अतिरिक्त जानकारी:

  • संस्करण: 5.0.85
  • query_cache_limit: 1048576
  • query_cache_min_res_unit: 4096
  • query_cache_size: 104857600
  • query_cache_type: चालू
  • query_cache_wlock_invalidate: बंद
  • innodb_buffer_pool_size: 8841592832
  • 24 जीबी की रैम

2
dom.as/tech/query-cache-tuner इसे बहुत अच्छी तरह से
गाया जाता है

हे, बहुत व्यावहारिक।
क्रेग सेफ्टन

जवाबों:


16

आपको बस क्वेरी कैश को अक्षम करना चाहिए

[mysqld]
query_cache_size = 0

और फिर mysql को पुनरारंभ करें। मैं ऐसा क्यों सुझाऊंगा ???

क्वेरी कैश हमेशा InnoDB के साथ सिर बट जाएगा। यह अच्छा होगा यदि InnoDB के MVCC क्वेरी को कैश से परोसा जाएगा, अगर संशोधनों से अन्य लेनदेन पर बार-बार होने वाली रीडिंग प्रभावित नहीं होती हैं। दुर्भाग्य से, InnoDB बस ऐसा नहीं करता है। जाहिर है, आपके पास बहुत सारे प्रश्न हैं जो जल्दी से अमान्य हो जाते हैं और शायद उनका पुन: उपयोग नहीं किया जा रहा है।

MySQL 4.0 के तहत InnoDB के लिए, क्वेरी कैश लेनदेन के लिए अक्षम किया गया था। MySQL 4.1+ के लिए, InnoDB ट्रैफ़िक पुलिस की भूमिका निभाता है जब प्रति तालिका के आधार पर क्वेरी कैश तक पहुँच की अनुमति देता है।

आपके प्रश्न के परिप्रेक्ष्य से, मैं कहूंगा कि क्वेरी कैश को हटाने का औचित्य इतना अधिक नहीं है, लेकिन InnoDB इसे कैसे प्रबंधित करता है।

InnoDB क्वेरी कैश के साथ कैसे इंटरैक्ट करता है, इस बारे में अधिक जानकारी के लिए, कृपया "उच्च प्रदर्शन MySQL (दूसरा संस्करण)" पुस्तक के पृष्ठ 213-215 पढ़ें ।

यदि आपका या आपका अधिकांश डेटा MyISAM है, तो आप SQL_NO_CACHE का उपयोग करने के अपने मूल विचार के साथ जा सकते हैं।

यदि आपके पास InnoDB और MyISAM का मिश्रण है, तो आपको अपने आवेदन के लिए सही संतुलन ढूंढना होगा कि आपके कैश मिस कितने उच्च हैं। वास्तव में, कैश बुक के कारणों में से एक ही पुस्तक के 209-210 पृष्ठ कारण बताते हैं:

  • क्वेरी अस्वीकार्य नहीं है, या तो क्योंकि इसमें एक nondeterministic निर्माण होता है (जैसे CURRENT_DATE) या क्योंकि इसका परिणाम सेट स्टोर करने के लिए बहुत बड़ा है। प्रत्येक प्रकार के अनछुए प्रश्नों के कारण Qc__not_cached स्थिति चर प्राप्त होता है।
  • सर्वर ने क्वेरी को पहले कभी नहीं देखा है, इसलिए इसके परिणाम को कैश करने का मौका कभी नहीं मिला।
  • क्वेरी का परिणाम पहले कैश किया गया था, लेकिन सर्वर ने इसे हटा दिया। ऐसा हो सकता है क्योंकि इसे रखने के लिए पर्याप्त मेमोरी नहीं थी, क्योंकि किसी ने सर्वर को इसे हटाने का निर्देश दिया था, या क्योंकि इसे अमान्य कर दिया गया था

और कुछ अस्वीकार्य प्रश्नों के साथ उच्च कैश मिस के मूल कारण हो सकते हैं:

  • क्वेरी कैश अभी तक गर्म नहीं है। यही कारण है कि सर्वर को परिणाम सेट के साथ कैश भरने का मौका नहीं मिला है।
  • सर्वर उन क्वेरी को देख रहा है जो उसने पहले नहीं देखी हैं। यदि आपके पास बहुत सारे दोहराए गए प्रश्न नहीं हैं, तो कैश के गर्म होने के बाद भी ऐसा हो सकता है।
  • बहुत सारे कैश अमान्य हैं।

UPDATE 2012-09-06 10:10 EDT

आपकी नवीनतम अद्यतन जानकारी को देखते हुए, आपने query_cache_limit1048576 (1M) पर सेट किया है। यह किसी भी परिणाम को 1M तक सीमित करता है। यदि आप कुछ बड़ा प्राप्त करते हैं, तो यह आसानी से कैश नहीं किया जाएगा। जबकि आपने query_cache_size104857600 (100M) पर सेट किया है, यह केवल 100 कैश्ड परिणामों के लिए एक आदर्श दुनिया में सेट करने की अनुमति देता है। यदि आप सैकड़ों प्रश्न करते हैं, तो विखंडन शीघ्रता से हो जाएगा। न्यूनतम आकार परिणाम सेट के रूप में आपके पास 4096 (4K) भी है। दुर्भाग्य से, mysql में क्वेरी कैश को डीफ़्रैग्मेन्ट करने का कोई आंतरिक तंत्र नहीं है।

यदि आपके पास क्वेरी कैश होना चाहिए और आपके पास बहुत अधिक RAM है, तो आप निम्नलिखित कार्य निष्पादित कर सकते हैं:

SET GLOBAL query_cache_size = 0;
SELECT SLEEP(60);
SET GLOBAL query_cache_size = 1024 * 1024 * 1024;

क्वेरी कैश को शुद्ध करने के लिए। आप सभी कैश्ड परिणाम खो देते हैं, इसलिए ऑफ-पीक घंटों के दौरान इन पंक्तियों को चलाएं।

मैं निम्नलिखित कार्य भी करूंगा:

  • query_cache_size = 1G
  • query_cache_limit = 8M

जो कि 23G RAM को छोड़ देता है। मैं निम्नलिखित उठाऊंगा:

  • innodb_buffer_pool_size = 12G
  • key_buffer_size = 4G

जो 7G निकलता है। यह ओएस और डीबी कनेक्शन के लिए पर्याप्त होना चाहिए।

ध्यान रखें कि प्रमुख बफर केवल MyISAM इंडेक्स पेजों को कैश करता है, जबकि InnoDB बफर पूल डेटा और इंडेक्स को कैश करता है।

एक और सिफारिश: MySQL 5.5 में अपग्रेड करें ताकि आप कई CPU के लिए InnoDB को कॉन्फ़िगर कर सकें और I / O को पढ़ने / लिखने के लिए कई थ्रेड्स बना सकें।

InnoDB के लिए कई सीपीयू तक पहुँचने के साथ संयोजन के रूप में MySQL 5.5 का उपयोग करने पर मेरी पिछली पोस्ट देखें

अद्यतन 2012-09-06 14:56 EDT

क्वेरी कैश को साफ़ करने के लिए मेरा तरीका अधिक चरम है क्योंकि यह कैश्ड डेटा को खो देता है और रैम के पूरी तरह से अलग सेगमेंट बनाता है। जैसा कि आपने अपनी टिप्पणी में इंगित किया है, FLUSH QUERY CACHE(जैसा कि आपने सुझाव दिया है) या इससे भी RESET QUERY CACHEबेहतर होगा। स्पष्टीकरण के लिए, जब मैंने कहा "कोई आंतरिक तंत्र नहीं," मेरा मतलब बिल्कुल यही था। डीफ़्रैग्मेन्टेशन की आवश्यकता है और मैन्युअल रूप से किया जाना है। यह crontab'd होना चाहिए

यदि आप MyISAM की तुलना में अधिक बार InnoDB पर DML (INSERTs, UPDATEs, DELETE) करते हैं, तो मैं कहूंगा कि क्वेरी कैश को पूरी तरह से हटा दें, जो मैंने शुरुआत में कहा था।


जवाब के लिए धन्यवाद। मेरे पास वह पुस्तक है और बड़े पैमाने पर इसका उपयोग कर रहे हैं; जिन कारणों से आप कैश मिस के लिए रूपरेखा तैयार करते हैं, उनके बारे में अच्छी तरह से जानते हैं, लेकिन जैसा कि मैंने उल्लेख किया है, हमने पहले से ही कैश के अवैध होने की पहचान कर ली है, क्योंकि हम कॉरसेल और क्यूचे_सिन्टर के बीच मजबूत संबंध के कारण एक महत्वपूर्ण मुद्दा है। ओह, और प्रश्न में DB में INNODB और MyISAM का मिश्रण है।
क्रेग सेफ्टन

आपके द्वारा अनुरोधित अतिरिक्त जानकारी के साथ अपडेट किया गया। धन्यवाद।
क्रेग सेफ्टन

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

"Mysql में क्वेरी कैश को डीफ़्रैग्मेन्ट करने के लिए कोई आंतरिक तंत्र नहीं है" के बारे में आपकी टिप्पणी के बारे में, क्या आप FLUSH QUERY CACHEइसे डीफ़्रैग्मेन्ट करने के लिए कमांड निष्पादित नहीं कर सकते ? देखें: dev.mysql.com/doc/refman/5.0/en/flush.html
Craig Sefton

मेरे उत्तर को अपडेट करें ...
रोलैंडमाइसीडीडीबीए

3

BAD: query_cache_size = 1G

क्यूं कर? क्योंकि एक फ्लश में कितना समय लगेगा। यही है, जब कुछ लिखता है, तो पूरे 1GB को स्कैन किया जाएगा जो संशोधित की गई तालिका के किसी भी संदर्भ को खोजने के लिए किया जाएगा। क्यूसी जितना बड़ा होता है, उतना ही धीमा। मैं 50M से अधिक के आकार की सिफारिश करता हूं, जब तक कि आपका डेटा शायद ही कभी बदलता है।

MyISAM और InnoDB दोनों के लिए QC ओवरहेड है। यह एक वैश्विक म्यूटेक्स निकालता है, और इसे जल्द ही बाहर निकालता है। यह म्यूटेक्स एक कारण है कि MySQL लगभग 8 कोर से अधिक का प्रभावी उपयोग नहीं कर सकता है।

Mutex लॉक होने के बाद SQL_NO_CACHE पर ध्यान नहीं दिया जाता है! उस ध्वज के एकमात्र उपयोग के बारे में बेंचमार्किंग के लिए है।

अक्सर रैम को कुछ अन्य कैश के लिए देना बेहतर होता है।


2

मैं इसके लिए एक सही मामले के बारे में सोच सकता हूं, और हमने पूरी तरह से परीक्षण किया है और इसे उत्पादन में चलाया है ... मैं इसे "तेज लेन" क्लस्टरिंग रणनीति कहता हूं :

यदि आप MaxScale जैसे प्रॉक्सी के साथ रीड-राइट स्प्लिटिंग करते हैं, या आपका एप्लिकेशन सक्षम है, तो आप उन रीडेड अमान्य तालिकाओं के लिए कुछ रीड्स केवल उन दासों को भेज सकते हैं जिनके पास क्वेरी कैश चालू है, और बाकी अन्य दासों के साथ कामोत्तेजित।

हम ऐसा करते हैं और हमारे लोड परीक्षणों (बेंचमार्क नहीं ... असली सौदा) के दौरान क्लस्टर के प्रति मिनट 4M कॉल को हैंडल करते हैं। एप्लिकेशन कुछ चीजों के लिए master_pos_wait () पर प्रतीक्षा करता है, इसलिए यह प्रतिकृति थ्रेड द्वारा थ्रॉटल किया जाता है, और हालांकि हमने इसे बहुत उच्च थ्रूपुट पर Qcache अमान्य होने की प्रतीक्षा की स्थिति के साथ देखा है, जो थ्रूपुट स्तर क्लस्टर से भी अधिक है Qcache के बिना सक्षम है।

यह काम करता है क्योंकि उन मशीनों को अमान्य करने के लिए छोटे क्वेरी कैश में शायद ही कुछ प्रासंगिक है (उन प्रश्नों को केवल बार-बार अद्यतन तालिकाओं के लिए प्रासंगिक है)। ये बक्से हमारे "फास्ट लेन" हैं। बाकी प्रश्नों के लिए, जो अनुप्रयोग करता है, उन्हें Qcache के साथ संघर्ष करने की आवश्यकता नहीं है क्योंकि वे इसे चालू किए बिना बक्से में जाते हैं।

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