आपको बस क्वेरी कैश को अक्षम करना चाहिए
[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_limit
1048576 (1M) पर सेट किया है। यह किसी भी परिणाम को 1M तक सीमित करता है। यदि आप कुछ बड़ा प्राप्त करते हैं, तो यह आसानी से कैश नहीं किया जाएगा। जबकि आपने query_cache_size
104857600 (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) करते हैं, तो मैं कहूंगा कि क्वेरी कैश को पूरी तरह से हटा दें, जो मैंने शुरुआत में कहा था।