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