當查詢進行時,如果設定了query cache,mysql會把查詢的結果儲存在qc中。儲存並不是在結果集完全得到的時候進行的,而是一邊檢索一邊儲存,mysql每次會分配一塊大小為query_cache_min_res_unit的記憶體用於儲存結果集,當使用完之後再分配一塊,所以如果結果集大於query_cache_min_res_unit會使得在一次查詢中進行多次記憶體的分配。
當最後一塊分配的記憶體沒有完全使用時,mysql會把這塊記憶體截斷,並把沒有使用的那部分歸還以重複利用。但是當多個query同時進行時,可能歸還的部分無法和空餘的記憶體合成連續的塊而造成這部分大小小於query_cache_min_res_unit無法再分配,這樣出現了無法再使用的記憶體碎片。乙個連續的同一型別的記憶體塊稱為block,包含使用的塊,也包含未使用的塊。
qcache_total_blocks 顯示了所有的塊數,而qcache_free_blocks 反映了未使用的塊數。如果qcache_free_blocks很大,說明記憶體的碎片很多,記憶體的使用率會比較差,所以這時雖然qcache_free_memory顯示還有剩餘的記憶體,也可能無法使用,當插入新的query時就需要清除舊的,使得qcache_lowmem_prunes很高。可以使用flush query cache重整記憶體,操作之後qcache_free_blocks應該為1,因為所有未使用的記憶體都放在一起作為連續的一塊了。可以根據
query的大小調整query_cache_min_res_unit以更好地利用記憶體。可以使用
(query_cache_size - qcache_free_memory)/ qcache_queries_in_cache
計算query的平均大小。不過不是把query_cache_min_res_unit設得越小越好,因為頻繁的分配記憶體會影響執行的速度。
我不知道乙個query會使用幾個block,對於乙個剛使用qc,發現每加入乙個query,block增加了2,但在乙個執行的伺服器上看到qcache_queries_in_cache*2和qcache_total_blocks要相差不少。
MySQL的Query Cache原理分析
querycache 下面簡稱qc 是根據sql語句來cache的。乙個sql查詢如果以select開頭,那麼mysql伺服器將嘗試對其使用qc。每個cache都是以sql文字作為key來存的。工作原理 查詢快取的工作原理,基本上可以概括為 查詢快取對什麼樣的查詢語句,無法快取其記錄集,大致有以下幾...
MysQL的Query Cache原理分析
querycache 下面簡稱qc 是根據sql語句來cache的。乙個sql查詢如果以select開頭,那麼mysql伺服器將嘗試對其使用qc。每個cache都是以sql文字作為key來存的。原理 querycache 下面簡稱qc 是根據sql語句來cache的。乙個sql查詢如果以select...
MySQL 中 QueryCache 的鎖模型
原文 有同學在問 mysql中 querycache qc 的鎖是 全域性鎖 還是 表鎖 這裡簡要說明一下。1 qc基本概念 這個是實現在mysql層 非引擎層 的乙個記憶體結構,基本規則是將滿足一定條件的查詢結果快取在記憶體中,若同樣的查詢再執行第二次,而且快取沒有失效,則可以直接返回查詢結果,無...