CodeGym/Java Course/All lectures for BN purposes/MySQL এ ক্যাশিং

MySQL এ ক্যাশিং

বিদ্যমান

7.1 ডিবি পাশে ক্যাশিং

টেবিলের সাথে কাজ করার সময় মাইএসকিউএল অত্যন্ত স্কেলযোগ্য অ্যালগরিদম ব্যবহার করে, তাই মাইএসকিউএল অল্প পরিমাণ মেমরির সাথেও চলতে পারে। স্বাভাবিকভাবেই, ভাল পারফরম্যান্সের জন্য, আপনার আরও 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শূন্য থেকে আলাদা হতে হবে। ডিমান্ড ব্যবহার করার সময়, নির্দেশিকা থাকা অনুরোধগুলিই ক্যাশে করা হবে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- ক্যাশে থাকা অনুরোধের সংখ্যা।

আপনি মোট SELECT প্রশ্নের সংখ্যা দেখতে পারেন:


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)

যদি এই মানটি> 0.8 হয়, তাহলে আপনার অনুরোধের 80% ক্যাশে করা হয়েছে, যা একটি খুব ভাল সূচক।

যদি %ক্যাশে হিট কম হয়, তাহলে আপনাকে মান বাড়াতে হবে 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 টিউনিং ডাটাবেসের কর্মক্ষমতা কয়েকগুণ উন্নত করতে পারে। এটি কেবল অ্যাপ্লিকেশনটির গতি বাড়াবে না, তবে একটি ভারী বোঝাও মোকাবেলা করবে।

মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই