Rumah > Artikel > pangkalan data > Apakah pengetahuan asas caching pertanyaan dalam MySQL?
Cache pertanyaan MySQL, walaupun tidak digunakan dalam MySQL 5.7 (dan dialih keluar dalam 8.0), menyimpan penyata yang dijalankan sebelum ini dalam ingatan: dengan kata lain, cache pertanyaan biasanya menyimpan penyataan SELECT di tengah memori pangkalan data. Jadi, jika kita menjalankan pertanyaan dan kemudian menjalankan pertanyaan yang sama sekali lagi beberapa waktu kemudian, keputusan akan dikembalikan dengan lebih cepat kerana ia akan diambil daripada memori dan bukannya dari cakera.
Cache pertanyaan menyimpan pertanyaan dan set hasil. Jadi apabila kami menjalankan pertanyaan yang sama, hasil cache pertanyaan dikembalikan serta-merta. Saiz cache pertanyaan boleh dikawal dengan menetapkan pembolehubah sistem query_cache_size, tetapi berikut adalah kaveat: jika anda mahu pertanyaan menggunakan cache pertanyaan, mereka mesti, mesti, sama, bait demi bait. Ini bermakna walaupun anda fikir kedua-dua pertanyaan ini harus dicache dengan cara yang sama:
SELECT * FROM demo_table WHERE column = 'Demo';
select * from demo_table where column = 'Demo';
Malah, mereka tidak begitu. Jika cache pertanyaan MySQL memerlukan semua pertanyaan adalah sama, maka tiada keputusan akan dikembalikan walaupun ia berbeza dengan hanya satu bait.
Jadi, untuk meringkaskan, apabila MySQL melaksanakan pernyataan, perkara pertama yang dilakukannya ialah menyemak untuk melihat sama ada caching pertanyaan didayakan (jika anda memerlukan penyegar semula, kembali ke blog terakhir kami mengenai Artikel pertanyaan MySQL yang perlahan. ) Jika caching pertanyaan didayakan, MySQL akan menyemak terlebih dahulu untuk sebarang padanan yang berkaitan dengan pertanyaan jika tiada padanan, MySQL akan meneruskan ke langkah seterusnya. Jika terdapat padanan pendua, MySQL akan mengembalikan hasil daripada cache pertanyaan.
Sebelum kembali ke perlawanan, cache pertanyaan MySQL memerlukan pengesahan daripada MySQL: d OES Pengguna ini mempunyai kebenaran yang diperlukan untuk menyelesaikan tindakan sedemikian? Sekiranya saya menolak untuk melaksanakan pertanyaan?
Berikut ialah senarai kebenaran yang disemak oleh MySQL:
|
Penerangan ringkas | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SEMUA |
Berikan semua kebenaran kepada pengguna MySQL tertentu. | ||||||||||||
SELECT |
Memberi kebenaran pengguna MySQL khusus untuk memilih baris daripada pangkalan data yang ditentukan. | ||||||||||||
KEMASKINI |
Memberi kebenaran pengguna MySQL khusus untuk mengemas kini baris sedia ada dalam jadual yang ditentukan. | ||||||||||||
TUNJUKKAN PANGKALAN DATA |
Membolehkan pengguna MySQL tertentu untuk mendapatkan senarai semua pangkalan data MySQL yang wujud dalam contoh MySQL tertentu . | ||||||||||||
PENGGUNAAN |
Memberi pengguna kuasa untuk menggunakan MySQL sahaja, yang bermaksud pengguna tidak boleh menjalankan sebarang pertanyaan di dalamnya. Pada asasnya sinonim untuk unprivileged. |
优先识别 |
MYSQL 状态 |
解释 |
---|---|---|
1 | MySQL 正在检查查询缓存中的权限。 | 首先,MySQL 检查特定用户是否有权访问特定结果。 |
2 | MySQL 正在检查查询本身的查询缓存。 | 接下来,MySQL 开始检查查询缓存中是否存在相同的查询。如果匹配,MySQL 返回;如果没有,MySQL 继续下一步。 |
3 | MySQL 将查询缓存中的条目标记为无效。 | 随着表的变化,查询缓存需要更新。所以在这一步中,MySQL 决定将查询缓存中的条目标记为无效。 |
4 | 发送结果。 | MySQL 发送缓存的结果并显示它。 |
5 | 将结果存储在缓存中。 | MySQL 将查询结果保存在查询缓存中。 |
6 | 查询缓存被锁定。 | 缓存过程现在结束——MySQL 锁定查询缓存。 |
Pengenalpastian Keutamaan | Status MYSQL | Penjelasan |
---|---|---|
1 | MySQL sedang menyemak kebenaran dalam cache pertanyaan. | Pertama, MySQL menyemak sama ada pengguna tertentu mempunyai kebenaran untuk mengakses hasil tertentu. |
2 | MySQL sedang menyemak cache pertanyaan untuk pertanyaan itu sendiri. | Seterusnya, MySQL mula menyemak sama ada pertanyaan yang sama wujud dalam cache pertanyaan. Jika ada padanan, MySQL kembali jika tidak, MySQL meneruskan ke langkah seterusnya. |
3 | MySQL menandakan masukan dalam cache pertanyaan sebagai tidak sah. | Apabila jadual berubah, cache pertanyaan perlu dikemas kini. Jadi dalam langkah ini, MySQL memutuskan untuk menandakan entri dalam cache pertanyaan sebagai tidak sah. |
4 | Hantar hasilnya. | MySQL menghantar hasil cache dan memaparkannya. |
5 | Simpan hasil dalam cache. | MySQL menyimpan hasil pertanyaan dalam cache pertanyaan. |
6 | Cache pertanyaan dikunci. | Proses caching kini selesai - MySQL mengunci cache pertanyaan. |
Jika kami menggunakan sebarang pembolehubah dalam pertanyaan, sama ada dalam fungsi atau keadaan partition, cache pertanyaan akan menjadi tidak sah. Sebagai contoh, jika kita berurusan dengan data besar dan kita menggunakan SELECT ... INTO OUTFILE untuk memuatkan set data yang besar ke dalam MySQL, hasilnya tidak akan dicache sama ada. Biasanya cache pertanyaan tidak berfungsi apabila menggunakan pertanyaan seperti SELECT ... [LOCK | FOR | INTO], juga cache pertanyaan tidak berfungsi jika kita menyemak nilai AUTO_INCREMENT dalam lajur dengan nilai NULL, itu bermakna jika kita. Terdapat lajur kenaikan dengan AUTO_INCREMENT dan kami menjalankan pertanyaan seperti ini:
SELECT * FROM demo_table WHERE increment IS NULL;
Cache pertanyaan tidak akan berkuat kuasa.
Betul kata anda, semua ciri ini mungkin membuatkan sesetengah orang berasa ia tidak berguna. Walaupun seperti ciri-ciri lain dalam MySQL, cache pertanyaan mempunyai batasannya sendiri dan oleh itu tidak selalu berfungsi. Sebagai tambahan kepada yang dinyatakan di atas, ia enggan berfungsi apabila penyata menjana amaran atau apabila penyata dijalankan di atas meja dengan enjin storan SEMENTARA dan dalam beberapa kes sudut lain. Setiap kali seseorang menulis apa-apa pada jadual, cache pertanyaan juga dikosongkan.
Kefungsian cache pertanyaan juga bergantung pada parameter query_cache_size. Lebih besar parameter ini, lebih baik, tetapi ambil perhatian bahawa parameter ini banyak bergantung pada ingatan anda. Perlu diingat bahawa struktur asas cache pertanyaan memerlukan sekurang-kurangnya 40kB storan secara lalai dan nilai lalainya mungkin antara 1MB dan 16MB. Jika pangkalan data anda membaca data dengan kerap, meningkatkan nilai parameter boleh membantu mencari penyelesaian terbaik, tetapi cuba lagi.
Anda boleh mengosongkan keseluruhan kandungan cache pertanyaan menggunakan pernyataan "RESET QUERY CACHE". Jika anda menggunakan pernyataan seperti FLUSH TABLES, semua nilai cache pertanyaan juga akan dipadamkan.
MySQL malah membolehkan anda melihat berapa banyak pertanyaan yang disimpan dalam cache pertanyaan dengan menjalankan pertanyaan:
SHOW STATUS LIKE 'Qcache_queries_in_cache%';
Anda akan mendapat hasil seperti ini:
MySQL:
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| Qcache_queries_in_cache | 1 |
+-------------------------+--------+
Dalam kes ini, kami dapat melihat bahawa cache pertanyaan kami kini menyimpan cache hasil. Jalankan kenyataan seperti FLUSH TABLES dan semua nilai akan hilang.
Atas ialah kandungan terperinci Apakah pengetahuan asas caching pertanyaan dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!