Rumah >pangkalan data >tutorial mysql >Buka kunci Prestasi MySQL: Menguasai Pengoptimuman Cache Pertanyaan
Cache Pertanyaan ialah ciri dalam MySQL yang direka untuk meningkatkan prestasi pangkalan data dengan menyimpan cache hasil pertanyaan SELECT. Apabila pertanyaan yang telah dilaksanakan sebelum dijalankan semula, MySQL boleh dengan cepat menarik hasil daripada cache ini dan bukannya melaksanakannya semula terhadap pangkalan data. Ini bukan sahaja mempercepatkan pengambilan data tetapi juga mengurangkan beban pada pangkalan data, menjadikannya sangat cekap untuk pertanyaan yang kerap dijalankan dengan parameter yang konsisten.
Setiap kali pertanyaan dikeluarkan, MySQL mula-mula melihat dalam Cache Pertanyaan untuk menyemak sama ada hasil pertanyaan yang sama telah disimpan sebelum ini. Jika terdapat padanan, MySQL memintas proses pelaksanaan pertanyaan biasa dan terus menyediakan hasil cache. Ini lebih pantas kerana ia mengelakkan langkah pemprosesan pertanyaan dan akses cakera yang memakan masa, sebaliknya memanfaatkan kelajuan akses memori.
Kami kini beralih kepada pembolehubah cache pertanyaan kritikal – jenis_cache_query, saiz_cache_query, had_cache_query dan query_cache_min_res_unit – dan kesannya terhadap prestasi MySQL.
Pembolehubah query_cache_type dalam MySQL mengawal sama ada cache pertanyaan didayakan, dilumpuhkan atau ditetapkan untuk beroperasi hanya atas permintaan.
Cache pertanyaan menyimpan teks pernyataan SELECT bersama hasil yang sepadan yang dihantar kepada klien. Jika kenyataan yang sama diterima kemudian, pelayan mendapatkan semula keputusan daripada cache dan bukannya menghuraikan dan melaksanakan kenyataan itu semula. Mendayakan cache pertanyaan boleh mengurangkan dengan ketara masa yang diperlukan untuk mendapatkan hasil bagi pertanyaan yang kerap dijalankan dengan menyampaikannya daripada memori dan bukannya melaksanakannya semula.
Menetapkan pembolehubah query_cache_type dalam MySQL kepada nilai yang berbeza menentukan cara cache pertanyaan bertindak:
0 (MATI) – Melumpuhkan cache pertanyaan, walaupun penimbal bait query_cache_size masih diperuntukkan.
1 (HIDUP) – Mendayakan cache pertanyaan untuk semua pertanyaan PILIH melainkan SQL_NO_CACHE dinyatakan dalam pertanyaan.
2 (DEMAND) – Mendayakan cache pertanyaan hanya untuk pertanyaan yang secara eksplisit menggunakan klausa SQL CACHE.
Query_cache_type boleh dikonfigurasikan di luar talian atau dalam talian, apabila pelayan sedang berjalan. Konfigurasi mungkin lebih disukai dalam talian, untuk membolehkan ujian. Apabila pelayan dimulakan semula query_cache_type akan kembali.
Konfigurasi Baris Perintah:
mysqld> tetapkan jenis_cache_query global = XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Untuk mengesahkan bahawa pembolehubah telah diubah:
mysqld> tunjukkan pembolehubah global seperti 'query_cache_type'
Fail Konfigurasi:
[mysqld]
query_cache_type = XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Mulakan semula pelayan MySQL.
Mengikut pengesyoran umum, anda harus menetapkan query_cache_type kepada 1 (HIDUP) untuk persekitaran yang data jarang berubah tetapi bacaan kerap. Tetapkan kepada 0 (MATI) dalam persekitaran yang sangat dinamik di mana kos penyelenggaraan cache mungkin melebihi faedahnya.
Mendayakan cache pertanyaan secara sembarangan mungkin tidak selalu menghasilkan manfaat prestasi malah boleh merendahkan prestasi dalam sesetengah senario. Pertimbangkan faktor berikut semasa mengkonfigurasi query_cache_type:
Saiz cache pertanyaan – Cache yang lebih besar boleh menyimpan lebih banyak hasil pertanyaan tetapi memerlukan lebih banyak memori.
Corak pertanyaan – Pertanyaan dengan keputusan yang kerap berubah atau set hasil yang besar mungkin tidak mendapat manfaat daripada caching.
Ketidaksahihan cache – Kemas kini, sisipan atau pemadaman pada jadual cache membatalkan entri cache yang sepadan, yang membawa kepada churn cache.
Concurrency – Cache pertanyaan tidak sesuai untuk beban kerja serentak kerana isu perbalahan.
Versi MySQL – Ciri cache pertanyaan telah ditamatkan dalam MySQL 5.7 dan dialih keluar dalam MySQL 8.0, kerana ia mempunyai had dan boleh menyebabkan perbalahan dalam persekitaran berbilang benang.
Menentukan jumlah memori yang diperuntukkan untuk menyimpan hasil pertanyaan cache. Ini merupakan faktor utama dalam menentukan bilangan hasil yang boleh dicache sekali gus.
Pembolehubah query_cache_size menentukan jumlah memori yang diperuntukkan untuk cache pertanyaan. Nilai ini harus dilaraskan berdasarkan sifat beban kerja anda dan sumber memori yang tersedia:
Set Hasil Kecil – Jika aplikasi anda kerap melaksanakan pertanyaan yang mengembalikan set hasil kecil, saiz cache pertanyaan yang lebih besar boleh memberi manfaat. Ini membolehkan lebih banyak pertanyaan disimpan dalam cache, mengurangkan keperluan untuk pelaksanaan pertanyaan.
Pertanyaan Identik Kerap – Dalam senario di mana pertanyaan yang sama dilaksanakan berulang kali, meningkatkan query_cache_size boleh meningkatkan prestasi dengan menyimpan cache pertanyaan ini dan keputusannya.
Nisbah Hit Cache Pertanyaan – Memantau nisbah hit cache pertanyaan boleh memberikan cerapan tentang keberkesanan cache. Jika nisbah hit adalah rendah, meningkatkan query_cache_size boleh membantu meningkatkan kecekapan cache.
Query_cache_size boleh dikonfigurasikan di luar talian atau dalam talian, apabila pelayan sedang berjalan. Konfigurasi mungkin lebih disukai dalam talian, untuk membolehkan ujian. Apabila pelayan dimulakan semula query_cache_size akan kembali.
Konfigurasi Baris Perintah:
mysqld> tetapkan saiz_cache_query global = XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Untuk mengesahkan bahawa pembolehubah telah diubah:
mysqld> tunjukkan pembolehubah global seperti 'query_cache_size'
Fail Konfigurasi:
_[mysqld]
query_cache_size _= XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Mulakan semula pelayan MySQL.
Query_cache_size hendaklah ditetapkan berdasarkan memori yang tersedia dan sifat beban kerja anda. Menetapkannya terlalu besar boleh menyebabkan keletihan memori, manakala menetapkannya terlalu kecil boleh mengehadkan keberkesanannya.
Memantau penggunaan cache (hit berbanding sisipan) akan membimbing saiz yang sesuai. Mulakan dengan saiz sederhana, seperti 64MB hingga 128MB, dan laraskan berdasarkan prestasi dan memori sistem yang tersedia.
Pertimbangkan faktor berikut semasa mengkonfigurasi query_cache_size:
Corak pertanyaan – Pertanyaan dengan keputusan yang kerap berubah atau set hasil yang besar mungkin tidak mendapat manfaat daripada caching.
Ketidaksahihan cache – Kemas kini, sisipan atau pemadaman pada jadual cache membatalkan entri cache yang sepadan, yang membawa kepada churn cache.
Concurrency – Cache pertanyaan tidak sesuai untuk beban kerja serentak kerana isu perbalahan.
Versi MySQL – Ciri cache pertanyaan telah ditamatkan dalam MySQL 5.7 dan dialih keluar dalam MySQL 8.0 disebabkan oleh pengehadan dan perbalahan dalam persekitaran berbilang benang..
Pembolehubah ini menetapkan saiz maksimum untuk hasil pertanyaan individu yang boleh dicache. Ia menghalang pertanyaan besar daripada menggunakan jumlah ruang cache yang tidak seimbang.
Apabila hasil pertanyaan melebihi had_cache_query, hasilnya tidak dicache. Ini menghalang pertanyaan yang terlalu besar atau intensif sumber daripada mengisi cache dengan hasil yang mungkin tidak kerap digunakan semula. Dengan menetapkan nilai yang sesuai untuk query_cache_limit, anda boleh memastikan bahawa hanya hasil pertanyaan yang lebih kecil dan lebih biasa digunakan dicache, mengoptimumkan penggunaan memori.
Query_cache_limit boleh dikonfigurasikan di luar talian atau dalam talian, apabila pelayan sedang berjalan. Konfigurasi mungkin lebih disukai dalam talian, untuk membolehkan ujian. Apabila pelayan dimulakan semula query_cache_limit akan kembali.
Konfigurasi Baris Perintah:
mysqld> tetapkan had_cache_query global = XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Untuk mengesahkan bahawa pembolehubah telah diubah:
mysqld> tunjukkan pembolehubah global seperti 'query_cache_limit'
Fail Konfigurasi:
[mysqld]
query_cache_limit = XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Mulakan semula pelayan MySQL.
Lazimnya disyorkan untuk menetapkan query_cache_limit antara 1MB dan 4MB, bergantung pada sifat pertanyaan dan saiz cache yang tersedia. Adalah penting untuk ambil perhatian bahawa menetapkan query_cache_limit terlalu rendah boleh menyebabkan hasil pertanyaan berguna dikecualikan daripada cache, mengurangkan keberkesanan cache pertanyaan.
Pembolehubah query_cache_min_res_unit dalam MySQL menentukan saiz minimum dalam bait untuk blok yang diperuntukkan oleh cache pertanyaan. Tetapan ini memberi kesan kepada kecekapan cache pertanyaan dengan mengawal butiran hasil cache.
Apabila hasil pertanyaan disimpan dalam cache pertanyaan, ia menduduki sejumlah memori. Pembolehubah query_cache_min_res_unit mentakrifkan saiz minimum blok memori yang diperuntukkan untuk hasil cache ini. Jika hasil pertanyaan lebih kecil daripada nilai ini, ia masih akan menduduki saiz minimum yang ditentukan oleh query_cache_min_res_unit.
Query_cache_min_res_unit boleh dikonfigurasikan di luar talian atau dalam talian, apabila pelayan sedang berjalan. Konfigurasi mungkin lebih disukai dalam talian, untuk membolehkan ujian. Apabila pelayan dimulakan semula, query_cache_min_res_unit akan kembali.
Konfigurasi Baris Perintah:
mysqld> set global query_cache_min_res_unit = XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Untuk mengesahkan bahawa pembolehubah telah diubah:
mysqld> tunjukkan pembolehubah global seperti 'query_cache_min_res_unit'
_
Fail Konfigurasi:
_[mysqld]
query_cache_min_res_unit = XX
Ganti XX dengan nilai yang sesuai dengan keperluan pangkalan data anda. Mulakan semula pelayan MySQL.
Mengkonfigurasi query_cache_min_res_unit melibatkan penetapan pembolehubah kepada nilai yang sesuai yang mengimbangi penggunaan memori dengan kecekapan caching. Nilai harus dipilih berdasarkan saiz purata hasil pertanyaan dalam beban kerja anda.
Nilai yang lebih kecil mungkin membawa kepada penggunaan memori yang lebih cekap tetapi boleh meningkatkan overhed disebabkan lebih banyak entri cache.
Sebaliknya, nilai yang lebih besar mungkin mengurangkan bilangan entri cache tetapi boleh menyebabkan memori terbuang untuk hasil pertanyaan yang lebih kecil.
Analisis beban kerja anda untuk menentukan saiz purata hasil pertanyaan. Laraskan nilai query_cache_min_res_unit berdasarkan analisis ini untuk mencapai keseimbangan antara penggunaan memori dan kecekapan caching. Untuk kebanyakan persediaan, ini akan jatuh antara 16MB dan 64MB.
Cache pertanyaan telah ditamatkan pada MySQL 5.7.20 dan dialih keluar sepenuhnya dalam MySQL 8.0. Jika versi MySQL anda masih boleh menggunakan query_cache, ia perlu didayakan kerana ia dilumpuhkan secara lalai. Untuk mendayakan dan mengkonfigurasi cache pertanyaan dalam MySQL, MariaDB atau Percona, anda biasanya perlu mengakses fail my.cnf atau my.ini pelayan anda. Berikut ialah pendekatan langkah demi langkah:
1. Dayakan Cache Pertanyaan – Tetapkan query_cache_type kepada 1 atau 2. Menetapkan query_cache_type atau query_cache_size kepada sifar akan sentiasa melumpuhkan cache. Untuk caching terpilih (disyorkan untuk kebanyakan kes penggunaan), anda akan menggunakan:
jenis_cache_query = 1
saiz_cache_query = 100J
3. Tentukan Had Saiz Keputusan – Konfigurasikan query_cache_limit untuk mengawal saiz hasil yang disimpan. Ini mungkin bermula pada beberapa megabait, bergantung pada saiz pertanyaan biasa anda:
query_cache_limit = 2J
4. Laraskan Unit Hasil Minimum – Ubah suai query_cache_min_res_unit berdasarkan keperluan anda. Mengurangkan ini di bawah lalai boleh membantu menggunakan ruang cache dengan lebih cekap, terutamanya jika anda menjangkakan banyak pertanyaan kecil:
query_cache_min_res_unit = 512
QCache Fragmentation ialah penunjuk utama prestasi Query Cache dalam MySQL. Ciri ini dibina untuk menyimpan hasil pertanyaan SELECT supaya permintaan berulang dapat dipenuhi dengan cepat tanpa perlu menjalankan semula pertanyaan, dengan itu meningkatkan prestasi. Walau bagaimanapun, apabila masa berlalu, Cache Pertanyaan boleh menjadi berpecah-belah, membawa kepada pengurangan keberkesanan.
Lihat dokumentasi Pemeriksaan Kesihatan kami yang komprehensif, yang mengandungi maklumat dan arahan langkah demi langkah tentang cara mengira Pecahan QCache.
Setelah anda mengira Pecahan QCache dan QcacheDeleteRate, anda perlu mentafsir keputusan. Sebaik-baiknya, Pecahan QCache hendaklah kurang daripada 10 dan QcacheDeleteRate hendaklah kurang daripada 20.
Jika Pecahan QCache tinggi, anda mungkin perlu melaraskan saiz Cache Pertanyaan untuk mengurangkan pemecahan. Jika QcacheDeleteRate adalah tinggi, anda mungkin perlu meningkatkan saiz Query Cache atau mengoptimumkan pertanyaan anda untuk mengurangkan bilangan INSERT.
Menala Cache Pertanyaan MySQL melibatkan pelarasan beberapa tetapan untuk mengoptimumkan prestasi pangkalan data, daripada mengurus penggunaan memori kepada mengurangkan masa pertanyaan. Walaupun pembolehubah yang dibincangkan di sini membentuk asas yang baik, pengurusan yang berkesan memerlukan pemantauan dan kemas kini berterusan berdasarkan beban dan prestasi sistem sebenar.
Untuk memudahkan proses ini, pertimbangkan untuk menggunakan alat pengurusan yang berkuasa seperti Releem yang mengautomasikan pelarasan ini. Alat sedemikian boleh memantau prestasi sistem anda secara berterusan dan mengemas kini tetapan query_cache secara dinamik dalam masa nyata.
Ini memberi anda masa untuk menumpukan pada matlamat yang lebih luas sementara Releem mengendalikan selok-belok pengoptimuman Cache Pertanyaan.
Atas ialah kandungan terperinci Buka kunci Prestasi MySQL: Menguasai Pengoptimuman Cache Pertanyaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!