MySQL> select @@query_cache_type;
+--------------------+
| @@query_cache_type |
+--------------------+
| ON |
+--------------------+
MySQL> set query_cache_type=off;
MySQL> set query_cache_type=on;
MySQL>
MySQL> select sql_cache id, title, body from article;
MySQL> select sql_no_cache id, title, body from article;
MySQL> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
1 row in set (0.00 sec)
查看MySQL 查詢快取的大小
MySQL> select @@global.query_cache_size;
+---------------------------+
| @@global.query_cache_size |
+---------------------------+
| 16777216 |
+---------------------------+
1 row in set (0.00 sec)
MySQL> select @@query_cache_size;
+--------------------+
| @@query_cache_size |
+--------------------+
| 16777216 |
+--------------------+
1 row in set (0.00 sec)
查看最大緩衝結果,如果結果集大於該數,不緩衝。
MySQL> select @@global.query_cache_limit;
+----------------------------+
| @@global.query_cache_limit |
+----------------------------+
| 1048576 |
+----------------------------+
1 row in set (0.00 sec)
磁碟重組
MySQL> flush query cache
-> ;
Query OK, 0 rows affected (0.00 sec)
清除緩衝
MySQL> reset query cache
-> ;
Query OK, 0 rows affected (0.00 sec
監視MySQL 查詢快取效能:
MySQL> flush tables;
Query OK, 0 rows affected (0.04 sec)
MySQL> show status like 'qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16768408 |
| Qcache_hits | 6 |
| Qcache_inserts | 36 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 86 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+----------+
8 rows in set (0.06 sec)
show variables like 'query_cache%'
query_cache_limit
如果單個查詢結果大於這個值,則不Cache
query_cache_size
分配給QC的記憶體。如果設為0,則相當于禁用QC。要注意QC必須使用大約40KB來儲存它的結構,如果設定小於40KB,則相當于禁用QC。QC儲存的最小單位是1024 byte,所以如果你設定了一個不是1024的倍數的值,這個值會被四捨五入到最接近當前值的等於1024的倍數的值。
query_cache_type
0 完全禁止QC,不受SQL語句控制(另外可能要注意的是,即使這裡禁用,上面一個參數所設定的記憶體大小還是會被分配);1啟用QC,可以在SQL語句使用SQL_NO_CACHE禁用;2可以在SQL語句使用SQL_CACHE啟用。
query_cache_min_res_unit
每次給QC結果分配記憶體的大小
show status like 'Qcache%'
Qcache_free_blocks
當一個表被更新之後,和它相關的cache blocks將被free。但是這個block依然可能存在隊列中,除非是在隊列的尾部。這些blocks將會被統計到這個值來。可以用FLUSH QUERY CACHE語句來清空free blocks。
Qcache_free_memory
可用記憶體,如果很小,考慮增加query_cache_size
Qcache_hits
自mysql進程啟動起,cache的命中數量
Qcache_inserts
自mysql進程啟動起,被增加進QC的數量
Qcache_lowmem_prunes
由於記憶體過少而導致QC被刪除的條數。加大query_cache_size,儘可能保持這個值0增長。
Qcache_not_cached
自mysql進程啟動起,沒有被cache的唯讀查詢數量(包括select,show,use,desc等)
Qcache_queries_in_cache
當前被cache的SQL數量
Qcache_total_blocks
在QC中的blocks數。一個query可能被多個blocks儲存,而這幾個blocks中的最後一個,未用滿的記憶體將會被釋放掉。例如一個QC結果要佔6KB記憶體,如果query_cache_min_res_unit是4KB,則最後將會產生3個blocks,第一個block用來儲存sql語句文本,這個不會被統計到query+cache_size裡,第二個block為4KB,第三個block為2KB(先allocate4KB,然後釋放多餘的2KB)。每個表,當第一個和它有關的SQL查詢被CACHE的時候,會使用一個block來儲存表資訊。也就是說,block會被用在三處地方:表資訊,SQL文本,查詢結果。