7.1 DB बाजूला कॅशिंग

टेबल्ससह काम करताना MySQL अत्यंत स्केलेबल अल्गोरिदम वापरते, त्यामुळे MySQL अगदी कमी मेमरीसह देखील चालू शकते. स्वाभाविकच, चांगल्या कामगिरीसाठी, तुम्हाला अधिक RAM ची आवश्यकता आहे.

वर्तमान सेटिंग्ज पाहण्यासाठी, डेटाबेसशी कनेक्ट करा


#mysq -u root -p

mysql> show variables like 'query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 134217728 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
5 rows in set (0.00 sec)

प्रथम, कॅशिंग सक्षम असल्याची खात्री करा. चल:

  • query_cache_typeचालू (1) किंवा मागणी (2) असणे आवश्यक आहे
  • query_cache_limit- कॅशेमध्ये येणार्‍या निकालाचा कमाल आकार निर्धारित करते
  • query_cache_sizeशून्यापेक्षा वेगळे व्हा. DEMAND वापरताना, केवळ निर्देश असलेल्या विनंत्या कॅश केल्या जातीलSQL_CACHE;
  • query_cache_min_res_unitकॅशे केलेल्या क्वेरीचे परिणाम संचयित करण्यासाठी वाटप केलेल्या मेमरी ब्लॉकचा किमान आकार. MySQL कॅशे एका मोठ्या मेमरीमध्ये संचयित करत नाही, त्याऐवजी ते query_cache_min_res_unitमागणीनुसार कमीत कमी आकाराचे (=4KB बाय डीफॉल्ट) ब्लॉक्सचे वाटप करते. शेवटचा असा ब्लॉक डेटा आकारात कापला जातो आणि उर्वरित मेमरी मुक्त केली जाते.

कॅशिंगचा परिणाम असा आहे की जेव्हा सर्व्हरला विनंती प्राप्त होते, तेव्हा विनंतीचा हॅश कॅशेमध्ये आहे की नाही हे पाहतो. जर हॅश जुळत असेल तर - सर्व्हर ताबडतोब निकाल देतो - विनंतीचे विश्लेषण न करता, ऑप्टिमाइझ करणे इ. ओव्हरहेड - कॅशिंग यंत्रणेसह - कॅशे ब्राउझ करणे, कॅशेवर क्वेरी निकाल लिहिणे इ.

आणि जर तुमच्याकडे कॅशेमध्ये बर्‍याच लहान विनंत्या असतील तर मोठ्या संख्येने विनामूल्य ब्लॉक्समुळे मेमरी फ्रॅगमेंटेशन होऊ शकते. आणि यामुळे, मेमरीच्या कमतरतेमुळे कॅशे केलेल्या नोंदी हटवल्या जातात. या प्रकरणात, चे मूल्य कमी करणे अर्थपूर्ण आहे query_cache_min_res_unit. तुमच्‍या बहुतांश क्‍वेरींनी मोठे परिणाम दिल्‍यास, ही सेटिंग वाढवण्‍याने कार्यप्रदर्शन सुधारू शकते.

चला परिणामाचे मूल्यांकन करण्याचा प्रयत्न करूया. कॅशे हिट काउंटर कसे बदलतात (Qcahe_hits), मेमरी अभावी (Qcache_lowmem_prunes) अवैध घोषित केलेल्या विनंत्यांची संख्या, SELECT प्रकारच्या विनंत्यांची एकूण संख्या (आणि फक्त त्या कॅश केल्या जातात) हे आम्ही पाहतो:


#mysq -u root -p
mysql> show status like 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 715       |
| Qcache_free_memory      | 130369640 |
| Qcache_hits             | 24209     |
| Qcache_inserts          | 16215     |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 444       |
| Qcache_queries_in_cache | 1740      |
| Qcache_total_blocks     | 4225      |
+-------------------------+-----------+
8 rows in set (0.00 sec)

7.2 वर्तमान कॅशे स्थिती

क्वेरी कॅशेचे परीक्षण करण्यासाठी वापरले जाते SHOW STATUS:


mysql> SHOW STATUS LIKE 'Qcache_%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 10       |
| Qcache_free_memory      | 16755496 |
| Qcache_hits             | 49812    |
| Qcache_inserts          | 103999   |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 180      |
| Qcache_queries_in_cache | 6        |
| Qcache_total_blocks     | 28       |
+-------------------------+----------+
8 rows in set (0.00 sec)
  • Qcache_free_blocksकॅशेमध्ये किती विनामूल्य ब्लॉक्स आहेत ते दर्शविते (कॅशे केलेल्या विनंत्या वाढल्यामुळे कमी होतील);
  • Qcache_total_blocks- व्यापलेल्या ब्लॉक्सची संख्या;
  • Qcache_free_memory- कॅशिंगसाठी विनामूल्य "उपलब्ध" मेमरी दर्शविते;
  • Qcache_hits- विनंत्यांची संख्या, ज्याचे परिणाम कॅशेमधून घेतले गेले होते, प्रत्यक्षात डेटाबेसमध्ये प्रवेश न करता;
  • Qcache_inserts- कॅशेमध्ये जोडलेल्या विनंत्यांची संख्या;
  • Qcache_lowmem_prunes- मेमरीच्या कमतरतेमुळे कॅशेमधून काढलेल्या विनंत्यांची संख्या;
  • Qcache_not_cached- वेळ व्यवस्थापन कार्ये इत्यादींच्या वापरामुळे कॅशेवर न लिहिलेल्या विनंत्यांची संख्या;
  • Qcache_queries_in_cache- कॅशेमध्ये असलेल्या विनंत्यांची संख्या.

तुम्ही एकूण निवडक प्रश्नांची संख्या पाहू शकता:


mysql> show status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 16719 |
+---------------+-------+
1 row in set (0.00 sec)

7.3 कॅशिंग कार्यक्षमता

व्हेरिएबलचे मूल्य विभाजित करून कॅशेच्या परिणामकारकतेचे मूल्यांकन करण्याची शिफारस केली जाते Qcache_hits on Qcache_hits + Com_select, कारण विनंतीवर प्रक्रिया करताना, Qcache_hits काउंटर वाढते (जर विनंती कॅशेमधून प्रक्रिया केली जाते) किंवा Com_select (जर विनंती कॅशे केली नसेल तर). ही पद्धत "Mysql परफॉर्मन्स ऑप्टिमायझेशन" O'reilly मध्ये सुचवली आहे

ऑनलाइन दुसरा मार्ग आहे

qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)

जर हे मूल्य > ०.८ असेल, तर तुमच्या ८०% विनंत्या कॅश केल्या जातात, जे खूप चांगले सूचक आहे.

कॅशे हिट कमी असल्यास %, आपल्याला मूल्य वाढवणे आवश्यक आहे query_cache_size.

वर्तमान मूल्य असे पाहिले जाऊ शकते:

SHOW VARIABLES LIKE 'query_cache_size';

पुन्हा, प्रश्न उद्भवतो: पुरेसे मूल्य कसे निवडायचेquery_cache_size?

हे मदत करेल Qcache_lowmem_prunes. हे व्हेरिएबल नवीन विनंत्या कॅशे करण्याच्या गरजेमुळे कॅशेमधून काढल्या गेलेल्या विनंत्यांची संख्या संग्रहित करते. अशा कॅशे आकारासाठी प्रयत्न करणे आवश्यक आहे ज्यामध्ये Qcache_lowmem_prunesते फक्त किंचित वाढेल. हे करण्यासाठी, प्रति तास मूल्यांमधील फरक Qcache_lowmem_prunesआणि त्याच तासात mysql द्वारे प्राप्त झालेल्या विनंत्यांची संख्या यांची तुलना करण्याची शिफारस केली जाते.

"प्रॅक्टिसमध्ये, query_cache_size ची गणना करण्यासाठी 2 पैकी एक सूत्र वापरले जाऊ शकते:

query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2

किंवा

query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2
query_cache_size = (10 मिनिटांत रहदारी खंड) * 1.2 "

हे 10 मिनिटांसाठी विनंत्या कॅशे करेल + कॅशे फ्रॅगमेंटेशन आणि अतिरिक्त कॅशिंग रिझर्व्हसाठी अतिरिक्त 20% मेमरी देईल

तुम्ही अनुक्रमे Bytes_sent व्हेरिएबल्स वापरून विनंतीला प्रतिसादाची संख्या आणि सरासरी व्हॉल्यूम मोजू शकता .

आणि म्हणून query_cache_sizeआम्ही मूल्ये वाढवली, त्यानंतर आपण मूल्यांकडे लक्ष दिले पाहिजे Qcache_total_blocksआणि Qcache_free_blocks. Qcache_queries_in_cacheMySQL ब्लॉकमध्ये कॅशे संचयित करते. 1 विनंतीसाठी, 2 ब्लॉक आवश्यक आहेत: एक विनंती मजकूरासाठी, दुसरा निकालासाठी.

जर आपण मूल्यावरून सारणीचा विचार केलाQcache%

कॅशे ब्लॉक्सची एकूण संख्याQcache_total_blocks – 28

विनंती 6 आता कॅश केली आहे, याचा अर्थ 6 * 2 = 12 ब्लॉक व्यस्त आहेत

मोफत ब्लॉक्स Qcache_free_blocks – 10. अधिक निष्क्रिय Qcache_free_blocks, कॅशेच्या "विखंडन" ची डिग्री जास्त.

जर बहुतेक क्वेरींमध्ये थोड्या प्रमाणात परिणामी डेटा असेल, तर किमान कॅशे ब्लॉक आकार कमी करणे योग्य आहे query_cache_min_res_unit, जे डीफॉल्टनुसार 4 KB आहे.

जर बहुतेक विनंत्या भरपूर डेटा परत करत असतील तर कॅशे ब्लॉकचा आकार वाढवणे फायदेशीर आहे.

मुख्य गोष्ट म्हणजे किमान मूल्य प्राप्त करणे Qcache_free_blocks.

जर काउंटर Qcache_not_cachedमोठा असेल, तर तुम्ही व्हेरिएबल वाढवण्याचा प्रयत्न करू शकता query_cache_limit- ते तुम्हाला मर्यादा वाढवण्यास आणि "फिट नसलेल्या" प्रश्नांचे परिणाम कॅशे करण्यास अनुमती देईल.

क्वेरी कॅशे वापरण्यासाठी खालील कॉन्फिगरेशन व्हेरिएबल्स जबाबदार आहेत:

  • query_cache_size- क्वेरी कॅशेचा आकार. query_cache_size = 0कॅशे वापर अक्षम करते;
  • query_cache_limit- कॅशेमध्ये साठवलेल्या कमाल नमुन्याचा आकार;
  • query_cache_wlock_invalidate- ज्या टेबलशी ते संबंधित आहेत ते वाचनासाठी लॉक केले असल्यास डेटा कॅशेमधून घेतला जाईल की नाही हे निर्धारित करते.
  • =

mysql क्वेरी कॅशिंग सक्षम करण्यासाठी, my.cnf (विभाग [mysqld]) मध्ये फक्त खालील ओळी जोडा :


query_cache_size = 268435456
query_cache_type =1 
query_cache_limit =1 048576

आणि सेवा पुन्हा सुरू करा.

7.4 जेथे कॅशे वापरले जात नाही

कॅश केलेले नाही:

  • कडून विनंतीSQL_NO_CACHE
  • तयार प्रश्न(Prepared statements);
  • बाहेरील क्वेरीच्या सबक्वेरी असलेल्या क्वेरी;
  • संग्रहित कार्यपद्धती आणि कार्ये अंतर्गत प्रश्न;
  • कार्ये वापरणारे प्रश्न:

    BENCHMARK (), CONNECTION_ID (), CONVERT_TZ (), CURDATE (), CURRENT_DATE (), CURRENT_TIME (), CURRENT_TIMESTAMP (), CURTIME (), DATABASE (), ENCRYPT ()एका युक्तिवादाने , FOUND_ROWS (), GET_LOCK (), LAST_INSERT_ID (), LOAD_FILE (), MASTER_POS_WAIT (), NOW (), RAND (), RELEASE_LOCK (), SLEEP (), वादविना SYSDATE (), ,UNIX_TIMESTAMP ()USER ()UUID ();

  • mysql सिस्टम डेटाबेस किंवा INFORMATION_SCHEMA मध्ये संग्रहित कार्ये, वापरकर्ता चल किंवा संदर्भ सारणी वापरून क्वेरी ;
  • • खालील फॉर्ममध्ये विनंत्या:
    • SELECT ... IN SHARE MODE
    • SELECT ... FOR UPDATE
    • SELECT ... INTO OUTFILE ...
    • SELECT ... INTO DUMPFILE ...
    • SELECT * FROM ... WHERE autoincrement_col IS NULL
  • तात्पुरत्या सारण्यांसह क्वेरी किंवा टेबल अजिबात न वापरता;
  • चेतावणी व्युत्पन्न करण्याची विनंती (इशारे);

तुम्ही कमांडसह कॅशे डीफ्रॅगमेंट करू शकता:

mysql>flush query cache;

स्पष्ट - आदेश:

mysql>flush query cache;

सर्वात महत्वाचे

डीफॉल्ट सेटिंग्जसह उत्पादनामध्ये कधीही कार्य करू नका. यामुळे सर्व्हरची बहुतेक संसाधने वापरली जाणार नाहीत. योग्य MySQL ट्यूनिंग डेटाबेस कार्यप्रदर्शन अनेक वेळा सुधारू शकते. हे केवळ अनुप्रयोगास गती देणार नाही तर मोठ्या भाराचा सामना देखील करेल.