Dari Versi 4. 0. 1, server MySQL memiliki fitur Query Cache. Saat digunakan, cache kueri menyimpan teks kueri SELECT bersama dengan hasil terkait yang dikirim ke klien. Jika kueri identik lainnya diterima, server kemudian dapat mengambil hasilnya dari cache kueri alih-alih mem-parsing dan mengeksekusi kueri yang sama lagi
Cache kueri sangat berguna di lingkungan di mana [beberapa] tabel tidak terlalu sering berubah dan Anda memiliki banyak kueri yang identik. Ini adalah situasi umum untuk banyak server web yang menggunakan banyak konten dinamis
Berikut adalah beberapa data kinerja untuk cache kueri [kami mendapatkannya dengan menjalankan rangkaian benchmark MySQL pada Linux Alpha 2x500MHz dengan RAM 2G dan cache kueri 64M]
Jika Anda ingin menonaktifkan kode cache kueri, setel query_cache_size=0. Dengan menonaktifkan kode cache kueri, tidak ada overhead yang terlihat. [cache permintaan dapat dikecualikan dari kode dengan bantuan opsi konfigurasi --tanpa-permintaan-cache]
Jika semua kueri yang Anda buat sebelumnya sederhana [seperti memilih baris dari tabel dengan satu baris], tetapi masih berbeda sehingga kueri tidak dapat di-cache, biaya tambahan untuk mengaktifkan cache kueri adalah 13%. Ini bisa dianggap sebagai skenario terburuk. Namun, dalam kehidupan nyata, kueri jauh lebih rumit daripada contoh sederhana kami, sehingga biaya overhead biasanya jauh lebih rendah
Pencarian setelah satu baris dalam tabel satu baris 238% lebih cepat. Ini dapat dianggap mendekati percepatan minimum yang diharapkan untuk kueri yang di-cache
Bagaimana Cache Kueri Beroperasi
Kueri dibandingkan sebelum parsing. Jadi
SELECT * FROM TABLE
dan
Select * from table_
dianggap sebagai kueri yang berbeda untuk cache kueri, jadi kueri harus persis sama [byte untuk byte] agar terlihat identik. Selain itu, kueri mungkin terlihat berbeda jika misalnya, satu klien menggunakan format protokol komunikasi baru atau kumpulan karakter yang berbeda dari yang digunakan oleh klien lain.
Kueri yang menggunakan database berbeda, menggunakan versi protokol berbeda, atau rangkaian karakter default dianggap sebagai kueri berbeda dan di-cache secara terpisah
Cache berfungsi untuk SELECT CALC_ROWS. dan PILIH DITEMUKAN_ROWS[ ]. ketik kueri karena jumlah baris yang ditemukan juga disimpan di cache
Jika tabel berubah [INSERT, UPDATE, DELETE, TRUNCATE, ALTER, atau DROP TABLE. DATABASE], semua kueri dalam cache yang menggunakan tabel ini [mungkin melalui tabel MRG_MyISAM. ] menjadi tidak valid dan dihapus dari cache
Tabel InnoDB transaksional yang telah diubah akan dibatalkan saat COMMIT dilakukan
Kueri tidak dapat di-cache jika berisi salah satu dari fungsi ini
Fungsi
Fungsi
Fungsi
Fungsi
Fungsi yang Ditentukan Pengguna
CONNECTION_ID
DITEMUKAN_ROWS
DAPATKAN_KUNCI
RELEASE_LOCK
LOAD_FILE
MASTER_POS_WAIT
SEKARANG
SYSDATE
CURRENT_TIME- STAMP
CURDATE
TANGGAL SEKARANG
KURTIME
WAKTU SAAT INI
DATABASE
ENKRIP [dengan satu parameter]
LAST_INSERT_ID
RAND
UNIX_TIME- STAMP [tanpa parameter]
PENGGUNA
TOKOH
Kueri juga tidak dapat di-cache jika berisi variabel pengguna, atau jika berbentuk SELECT. DALAM MODE BERBAGI atau PILIH * DARI AUTOINCREMENT_FIELD ADALAH NULL [untuk mengambil id penyisipan terakhir - solusi ODBC]
Namun, FOUND ROWS[ ] akan mengembalikan nilai yang benar, meskipun kueri sebelumnya diambil dari cache
Kueri yang tidak menggunakan tabel apa pun, atau dalam kasus di mana pengguna memiliki hak istimewa kolom untuk salah satu tabel yang terlibat, tidak di-cache
Sebelum kueri diambil dari cache kueri, MySQL akan memeriksa apakah pengguna memiliki hak istimewa SELECT untuk semua database dan tabel yang terlibat. Jika tidak demikian, hasil yang di-cache tidak akan digunakan
Konfigurasi Cache Kueri
Cache kueri menambahkan beberapa variabel sistem MySQL untuk mysqld yang dapat diatur dalam file konfigurasi, pada baris perintah saat memulai mysqld
query_cache_limit
Jangan simpan hasil yang lebih besar dari ini. [Bawaan 1M. ]
query_cache_sizeMemori yang dialokasikan untuk menyimpan hasil dari kueri lama. Jika ini 0, cache kueri dinonaktifkan [default]
query_cache_startup_typeIni dapat diatur [hanya numerik] ke
Pilihan
Keterangan
0
NONAKTIF [jangan menyimpan atau mengambil hasil]
1
AKTIF [cache semua hasil kecuali SELECT SQL_NO_CACHE. kueri]
2
PERMINTAAN [hanya cache PILIH SQL_CACHE. kueri]
Di dalam utas [koneksi], perilaku cache kueri dapat diubah dari default. Sintaksnya adalah sebagai berikut
SQL_QUERY_CACHE_TYPE = OFF | ON | DEMAND SQL_QUERY_CACHE_TYPE = 0 | 1 | 2
Pilihan
Keterangan
0 atau MATI
Jangan menyimpan atau mengambil hasil
1 atau AKTIF
Cache semua hasil kecuali SELECT SQL_NO_CACHE. kueri
2 atau PERMINTAAN
Cache hanya PILIH SQL_CACHE. kueri
SQL_QUERY_CACHE_TYPE bergantung pada nilai query_cache_startup_type saat utas dibuat. Ini defaultnya
Opsi Cache Kueri di SELECT
Ada dua kemungkinan parameter terkait cache kueri yang dapat ditentukan dalam kueri SELECT
Pilihan
Keterangan
SQL_CACHE
Jika SQL_QUERY_CACHE_TYPE adalah DEMAND, izinkan kueri untuk di-cache. Jika SQL_QUERY_CACHE_TYPE AKTIF, ini adalah defaultnya. Jika MYSQL QUERY_CACHE_TYPE MATI, jangan lakukan apa pun
SQL_NO_CACHE
Jadikan kueri ini tidak dapat di-cache jangan izinkan kueri ini disimpan di cache
Permintaan Status Cache dan Pemeliharaan
Dengan perintah FLUSH QUERY CACHE Anda dapat mendefrag cache kueri untuk memanfaatkan memorinya dengan lebih baik. Perintah ini tidak akan menghapus kueri apa pun dari cache. FLUSH TABLES juga menghapus cache kueri
Perintah RESET QUERY CACHE menghapus semua hasil kueri dari cache kueri
Anda dapat memantau kinerja cache kueri di SHOW STATUS
Variabel
Keterangan
Qcache_queries_in_cache
Jumlah kueri yang terdaftar di cache
Qcache_inserts
Jumlah kueri yang ditambahkan ke cache
Qcache_hits
Jumlah hit cache
Qcache_not_cached
Jumlah kueri non-cache [tidak dapat di-cache, atau karena SQL_QUERY_CACHE_TYPE]
Qcache_free_memory
Jumlah memori kosong untuk cache kueri
Qcache_total_blocks
Jumlah total blok dalam cache kueri
Qcache_free_blocks
Jumlah blok memori bebas dalam cache kueri
Jumlah total kueri = Qcache_inserts + Qcache_hits + Qcache_not_cached
Cache kueri menggunakan blok dengan panjang variabel, sehingga Qcache_total_blocks dan Qcache_free_blocks dapat mengindikasikan fragmentasi memori cache kueri. Setelah FLUSH QUERY CACHE hanya tersisa satu blok kosong [besar].
Catatan. Setiap kueri memerlukan minimal dua blok [satu untuk teks kueri dan satu atau lebih untuk hasil kueri]. Juga, setiap tabel yang digunakan oleh kueri membutuhkan satu blok, tetapi jika dua atau lebih kueri menggunakan tabel yang sama, hanya satu blok yang perlu dialokasikan.