查詢緩存存儲SELECT查詢的文本和發送給客戶真個相應結果。如果隨后收到1個相同的查詢,服務器從查詢緩存中重新得到查詢結果,而不再需要解析和履行查詢。如果你有1個不常常改變的表并且服務器收到該表的大量相同查詢,查詢緩存在這樣的利用環境中10分有用。對許多Web服務器來講存在這類典型情況,它根據數據庫內容生成大量的動態頁面。
備注1.查詢緩存不返回舊的數據。當表更改后(如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE操作),查詢緩存值的相干條目被清空。2.如果你有許多mysqld服務器更新相同的MyISAM表,在這類情況下查詢緩存不起作用。3.查詢緩存不適用于服務器方編寫的語句。如果正在使用服務器方編寫的語句,要斟酌到這些語句將不會利用查詢緩存.
當MySQL服務器收到1個查詢要求的時候,MySQL服務器首先檢查用戶對所有相干數據庫和表的SELECT權限,如權限通過,然后以該SQL文本作為key來從查詢緩存中檢索是不是有相同的key(由于數據緩存都是以SQL文本作為key來保存的),如果從查詢緩沖中找到對應的key值,就返回1個對應的查詢結果,服務器把Qcache_hits狀態變量的值加1,而不需要解析器對sql語句進行解析,如果查找不到對應的key值,然后履行sql的解析,然后查詢,可以參考下圖。
備注:
1.作為key值的sql語句是辨別大小寫的,即SELECT * FROM t1
與select * from t1
對應的key值是不1樣的。所以,如果開啟了查詢緩沖,在寫SQL語句的時候,應注意這點。
2.如果1個表被更改了,那末使用那個表的所有緩沖查詢將不再有效,并且從緩沖區中移出,這樣保證了數據的1致性(即表中數據和緩沖中數據1致性)。
1.查看查詢緩沖是不是可以
MySQL中,可以通過have_query_cache服務器系統變量唆使查詢緩存是不是可用。即便禁用查詢緩存,當使用標準 MySQL2進制時,這個值總是YES。
2.其他重要配置參數
查詢緩存系統變量名以query_cache_ 開頭,以下圖,我們將逐1說明。
query_cache_size
查詢緩存大小,設置為0表示禁用查詢緩存。 默許緩存大小設置為0;也就是禁用查詢緩存。當設置query_cache_size變量為非零值時,應記住查詢緩存最少大約需要40KB來分配其數據結構。(具體大小取決于系統結構)。如果你把該值設置的太小,將會得到1個正告,且會將query_cache_size值設置為0。
在前面,我們可以得知,使用緩存,不可避免內存碎片,我們可使用FLUSH QUERY CACHE語句來清算查詢緩存碎片,以提高內存使用性能。該語句不從緩存中移出任何查詢。RESET QUERY CACHE語句從查詢緩存中移出所有查詢。FLUSH TABLES語句也履行一樣的工作,區分optimize table tableName,關于optimize可以參考(http://blog.csdn.net/hsd2012/article/details/51485250)。
為了監視查詢緩存性能,使用SHOW STATUS查看緩存狀態變量:
Qcache_free_blocks:緩存中相鄰內存塊的個數。數目大說明可能有碎片。履行FLUSH QUERY CACHE會對緩存中的碎片進行整理,只保存1個空閑塊。
Qcache_free_memory:緩存中的空閑內存。
Qcache_hits:每次查詢在緩存中命中時就增大
Qcache_inserts:每次插入1個查詢時就增大。命中次數除以插入次數就是不中比率。
Qcache_lowmem_prunes:緩存出現內存不足,并且必須為了緩存新的查詢,而從查詢緩沖區中移出到自由內存中的查詢的數目。這個數字最好長時間來看;如果這個 數字在不斷增長,就表示可能碎片非常嚴重,或內存很少。(上面的 Qcache_free_blocks和Qcache_free_memory可以告知您屬于哪一種情況) 。從查詢緩沖區移除查詢緩沖,使用最近最少使用(LRU)策略。
Qcache_not_cached:不合適進行緩存的查詢的數量,通常是由于這些查詢不是 SELECT 語句或用了now()之類的函數。
Qcache_queries_in_cache:當前緩存的查詢(和響應)的數量。
Qcache_total_blocks:緩存中塊的數量。
Qcache_total_blocks和Qcache_free_blocks可以顯示查詢緩存內存碎片。
備注
以上敘述,主要參考mysql手冊。
上一篇 JS學習20(高級技巧)