原文:https://dev.MySQL.com/doc/refman/5.5/en/query-cache-configuration.html
系統變量have_query_cache 標識緩存是否可用:
mysql> SHOW VARIABLES LIKE 'have_query_cache';+------------------+-------+| Variable_name | Value |+------------------+-------+| have_query_cache | YES |+------------------+-------+當使用時標準版MySQL時,該值總是YES,不論查詢緩存是否已經關閉。
還有一些系統變量控制緩存的操作行為。這些變量可以通過配置文件或者mysqld啟動命令行修改。與緩存相關的系統變量命名都是以“query_cache_”開頭的。在 Section 5.1.5, “Server System Variables”對這些變量有詳細的說明。
設置query_cache_size變量可以控制緩存的容量(size),設置為0表示關閉緩存。該變量的默認值是0,所以緩存默認時關閉的。
為了減少開銷,如果不使用查詢緩存,在啟動服務時將query_cache_type=0 。
注意 當使用窗口配置引導安裝或配置MySQL時,query_cache_size的默認值是按照選擇的配置類型自動調整的。當使用窗口配置向導,由于選擇的配置不同,查詢緩存可能是開啟的(也就是說,設置了非0值)。查詢緩存仍然可以通過query_cache_type變量控制。當配置完成后可以在my.ini文件中查看query_cache_type的具體值。
當你設置了query_cache_size為非0值,查詢緩存至少需要分配約40KB空間用來保存緩存的結構(具體需要多少空間取決于系統架構)。如果設置的值太小,會產生警告信息,如下示例:
mysql> SET GLOBAL query_cache_size = 40000;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> SHOW WARNINGS/G*************************** 1. row *************************** Level: Warning Code: 1282Message: Query cache failed to set size 39936; new query cache size is 0mysql> SET GLOBAL query_cache_size = 41984;Query OK, 0 rows affected (0.00 sec)mysql> SHOW VARIABLES LIKE 'query_cache_size';+------------------+-------+| Variable_name | Value |+------------------+-------+| query_cache_size | 41984 |+------------------+-------+如果需要查詢緩存能夠緩存所有的查詢結果,必須設置更大的值:
mysql> SET GLOBAL query_cache_size = 1000000;Query OK, 0 rows affected (0.04 sec)mysql> SHOW VARIABLES LIKE 'query_cache_size';+------------------+--------+| Variable_name | Value |+------------------+--------+| query_cache_size | 999424 |+------------------+--------+1 row in set (0.00 sec)query_cache_size的值基本上是1024 byte的倍數。這個值可能和你實際分配的不同。
如果query_cache_size的值大于0,query_cache_type將控制緩存時如何工作的。query_cache_type的取值如下:
0或OFF:不緩存數據或不從緩存中取數據。1或ON:使用緩存,但使用了SELECT SQL_NO_CACHE語法將不使用緩存。2或DEMAND:只有使用了SELECT SQL_CACH語法的sql使用緩存如果query_cache_size是0,最好將query_cache_type也設置為0.系統將不在驗證是否使用緩存,也就是說查詢緩存不可用并且在運行時減少執行查詢語句的開銷。
修改了全局變量query_cache_type的值后,將影響所有客戶端連接使用緩存的方式。客戶端可以在session上設置query_cache_type值,以達到定制化的緩存使用方式。例如,客戶端可以對自己發出查詢語句關閉緩存:
mysql> SET SESSION query_cache_type = OFF;如果你是在系統啟動時(不是運行時通過set語句)設置 query_cache_type的值,則只能設置數字。
為了控制每個查詢結果可以緩存的最大值,需要設置系統變量query_cache_limit,其默認值是1M。
千萬不要將緩存的容量設置的太大。由于線程在更新緩存時會對緩存加鎖,你會看到鎖在競爭非常多的緩存資源。
注意 你可以通過命令行SET語句加上 –maximum-query_cache_size=32M 選項或配置文件,在server運行時動態修改緩存的最大容量。
當以查詢被緩存以后,查詢結果(返回給客戶端的數據)被緩存并在后續的查詢中使用。 因為數據通常不會存在同一個內存塊內。查詢緩存會按需分配內存塊,當一塊內存填入數據后,再分配一個新的內存塊。因為內存分配操作(在時間上)代價是非常大的,系統變量 query_cache_min_res_unit 設置了查詢緩存分配的內存塊的最小值。當一個查詢語句執行后,前一個使用的緩存數據的代碼塊將會壓縮至實際使用的數據大小,未使用的空間將會釋放。由于查詢語句的類型(使用情況和返回數據量)不同,你可能需要調整 query_cache_min_res_unit參數來更有效的使用緩存:
query_cache_min_res_unit 默認值時4KB,該值能滿足絕大多數情況。如果你有大量的查詢返回的結果比較小,默認的塊大小可能會導致很多內存碎片。內存碎片會導致查詢緩存由于內存不足而被強制清除。在這種情況下,需要減少query_cache_min_res_unit的值。什么情況下釋放內存塊,釋放多少內存塊分別由Qcache_lowmem_PRunes和Qcache_free_blocks這兩個變量控制。如果很多查詢返回的數據量很大(根據Qcache_total_blocks and Qcache_queries_in_cache值判斷),你可以增加query_cache_min_res_unit值。無論如何,不要將這個值設置的太大(看前面的面說明)新聞熱點
疑難解答