Saat Anda menjalankan kueri SELECT, MySQL "mengingat" kueri dan hasil yang dikembalikannya. Hal ini dilakukan dengan menyimpan set hasil dalam cache khusus (disebut cache kueri) setiap kali kueri SELECT dijalankan. Kemudian, saat Anda meminta kueri yang sama ke server, MySQL akan mengambil hasilnya dari cache alih-alih menjalankan kueri lagi. Seperti yang dapat Anda bayangkan, ini sangat mempercepat proses
Meskipun diaktifkan secara default, Anda harus selalu memverifikasi bahwa caching kueri diaktifkan, yang dapat dilakukan dengan memeriksa variabel server. Contoh berikut mengilustrasikan
mysql> SHOW VARIABLES LIKE '%query_cache%';6 rows in set (0.00 sec)- Variabel pertama, have_query_cache, menunjukkan server telah dikonfigurasi untuk caching kueri saat diinstal (default)
- Variabel query_cache_size menunjukkan jumlah memori yang dialokasikan untuk cache dalam byte. Jika nilai ini adalah 0, caching kueri akan dinonaktifkan
- Nilai untuk variabel query_cache_type berkisar dari 0 hingga 2. Nilai 0 atau MATI menunjukkan bahwa caching kueri dinonaktifkan. ON atau 1 berarti caching kueri dihidupkan, dengan pengecualian pernyataan SELECT menggunakan opsi SQL_NO_CACHE. PERMINTAAN atau 2 menyediakan caching kueri sesuai permintaan untuk pernyataan SELECT yang berjalan dengan opsi SQL_CACHE
- Variabel query_cache_limit menentukan ukuran kumpulan hasil maksimum yang harus di-cache. Kumpulan hasil yang lebih besar dari nilai ini tidak akan di-cache
Anda dapat mengubah salah satu variabel ini menggunakan pernyataan SET GLOBAL atau SET SESSION, seperti yang ditunjukkan
mysql> SET GLOBAL query_cache_size = 16777216; Query OK, 0 rows affected (0.00 sec)Untuk melihat sendiri apa pengaruh cache kueri terhadap kinerja, jalankan kueri yang sama dengan dan tanpa caching kueri untuk membandingkan perbedaan kinerja. Ini versinya tanpa menggunakan cache kueri
mysql> SELECT SQL_NO_CACHE r.RouteID, a1.AirportCode, a2.AirportCode, -> r.Distance, r.Duration, r.Status FROM route AS r, -> airport AS a1, airport AS a2 -> WHERE r.From LIKE a1.AirportID -> AND r.To LIKE a2.AirportID -> AND r.RouteID IN -> (SELECT f.RouteID -> FROM flight AS f, flightdep AS fd -> WHERE f.FlightID = fd.FlightID -> AND f.RouteID = r.RouteID -> AND fd.DepTime BETWEEN '00:00' AND '04:00');2 rows in set (0.21 sec)Sekarang lakukan kueri yang sama dengan cache
mysql> SELECT SQL_CACHE r.RouteID, a1.AirportCode, -> a2.AirportCode, r.Distance, r.Duration, r.Status FROM -> route AS r, airport AS a1, airport AS a2 -> WHERE r.From LIKE a1.AirportID -> AND r.To LIKE a2.AirportID -> AND r.RouteID IN -> (SELECT f.RouteID -> FROM flight AS f, flightdep AS fd -> WHERE f.FlightID = fd.FlightID -> AND f.RouteID = r.RouteID -> AND fd.DepTime BETWEEN '00:00' AND '04:00');Peningkatan dramatis dalam kinerja bukanlah hal yang aneh jika caching kueri diaktifkan pada kueri yang sering diajukan
PERINGATAN
Setelah tabel diubah, kueri yang di-cache yang menggunakan tabel ini menjadi tidak valid dan dihapus dari cache. Ini mencegah kueri mengembalikan data yang tidak akurat dari tabel lama. Meskipun ini membuat caching kueri jauh lebih berguna, tabel yang terus berubah tidak akan mendapat manfaat dari caching. Dalam situasi ini, Anda mungkin ingin mempertimbangkan untuk menghapus cache kueri. Ini dapat dilakukan dengan menambahkan opsi SQL_NO_CACHE, seperti yang ditunjukkan sebelumnya, ke pernyataan SELECT
Saat menggunakan memcached untuk meng-cache data MySQL, aplikasi Anda harus mengambil data dari database dan memuat key-value pair yang sesuai ke dalam cache. Kemudian, pencarian selanjutnya dapat dilakukan langsung dari cache
Karena MySQL memiliki mekanisme caching dalam memorinya sendiri untuk data yang diminta, seperti InnoDB dan cache kueri MySQL, cari peluang di luar memuat nilai kolom atau baris individual ke dalam cache. Lebih suka meng-cache nilai komposit, seperti yang diambil dari beberapa tabel melalui kueri gabungan, atau kumpulan hasil yang disusun dari beberapa baris
Batasi informasi dalam cache untuk data yang tidak sensitif, karena tidak diperlukan keamanan untuk mengakses atau memperbarui informasi dalam instance memcache. Siapa saja yang memiliki akses ke mesin memiliki kemampuan untuk membaca, melihat, dan berpotensi memperbarui informasi. Untuk menjaga keamanan data, enkripsi informasi sebelum menyimpannya dalam cache. Untuk membatasi pengguna yang dapat terhubung ke server, nonaktifkan akses jaringan, atau gunakan IPTables atau teknik serupa untuk membatasi akses ke port memcache ke sekumpulan host tertentu
Anda dapat memperkenalkan memcached ke aplikasi yang sudah ada, meskipun caching bukan bagian dari desain aslinya. Dalam banyak bahasa dan lingkungan, perubahan pada aplikasi hanya beberapa baris, pertama mencoba membaca dari cache saat memuat data, kembali ke metode lama jika informasi tidak di-cache, dan memperbarui cache dengan informasi sekali
Urutan umum untuk menggunakan memcached dalam bahasa apapun sebagai solusi caching untuk MySQL adalah sebagai berikut
Minta item dari cache
Jika item ada, gunakan data item
Jika item tidak ada, muat data dari MySQL, dan simpan nilainya ke dalam cache. Ini berarti nilainya tersedia untuk klien berikutnya yang memintanya dari cache
Untuk diagram alir urutan ini, lihat
Gambar 16. 6 Bagan Alir Aplikasi memcache biasa
Mengadaptasi Praktik Terbaik Database ke Aplikasi memcache
Cara paling langsung untuk meng-cache data MySQL adalah dengan menggunakan tabel 2 kolom, di mana kolom pertama adalah a. Karena persyaratan keunikan untuk kunci memcache, pastikan skema database Anda menggunakan kunci utama dan
Jika Anda menggabungkan beberapa nilai kolom ke dalam satu nilai item memcache, pilih tipe data untuk memudahkan penguraian kembali nilai ke dalam komponennya, misalnya dengan menggunakan karakter pemisah antara nilai numerik
Kueri yang paling mudah memetakan pencarian memcache adalah kueri dengan klausa WHERE tunggal, menggunakan operator = atau IN. Untuk klausa WHERE yang rumit, atau yang menggunakan operator seperti <, >, BETWEEN, atau LIKE, memcache tidak menyediakan cara sederhana atau efisien untuk memindai atau memfilter kunci atau nilai terkait, jadi biasanya Anda melakukan operasi tersebut sebagai kueri SQL di