查詢快取 query cache

2022-03-31 20:18:09 字數 2314 閱讀 1110

mysql 把能夠快取的完整結果集快取起來。如果查詢語句包含任何不確定值的函式,得到的結果集是不確定的或者結果集大小超過了query_cache_limit限制,是不會被快取的。

mysql是判斷不出乙個sql能否被快取的,只能判斷查詢快取是否有相同的sql和產生的結果集到底是否能被快取起來。在解析sql過程中如果發現sql語句含有不確定函式,那麼就會標記產生的結果集不被快取。解析過程發生在檢查查詢快取之後。

如果一張表發生任何改變,關於這張表的所有查詢快取都將失效。即使一些改變並不會改變之前查詢的結果集。

mysql 檢查快取命中的方法非常簡單,首先執行一次不區分大小寫的檢查來驗證查詢是否以字母sel開發,如果滿足則會檢查查詢快取中是否有相同的查詢語句,只要字元大小寫,空格或者注釋有一點點不同,則會被認為不同的查詢。開頭有空格除外。如果找到有相同的查詢語句,則直接把快取的結果集傳送給客戶端,這樣就不會再執行解析和執行等操作。

select * from tabname 與 select * from tabname 就被認為是兩條不同的sql語句,因為這個時候沒有進行任何解析。

5.1版本中,檢視產生的查詢可以被快取。

flush query cache 主要用於整理碎片,不會清理查詢快取, reset query cache則會清空查詢快取,包括之前已經快取的查詢語句結果集。

如果啟動查詢快取,每次查詢語句執行之前會先在查詢快取裡查詢是否已存在,要麼在快取中找到相應結果集直接返回給客戶端,要麼進行解析與執行,在解析過程中就知道產生的結果集能否被快取,因此產生結果集後要麼先在快取裡快取起來再返回給客戶端要麼直接返回給客戶端。

當乙個查詢sql傳送到mysql服務後,如果查詢快取裡存在相同的sql,qcache_hits值加1,如果沒有,就繼續解析與執行,如果產生的集結集能被快取那麼qcache_inserts + 1,和com_select + 1,如果不能被快取則qcache_not_cached + 1與com_select + 1.查詢快取命中率qcache_hits /qcache_hits + com_select.  不能快取率 qcache_not_cached /com_select. 能快取率qcache_inserts/com_select. 其實select查詢的總數量等價於:com_select + qcache_hits  + queries with errors found by parser. 但是我們可以忽略queries with errors found by parser.

記憶體塊分配:服務啟動開始,就會分配好query_cache_size定義的記憶體塊,最開始只有乙個大記憶體塊,當有結果集需要請求時,因為最開始是不知道結果集的大小的,只知道有結果集需要被快取,所以開始就會從大記憶體塊裡分配出乙個query_cache_min_res_unit大小的記憶體塊,如是不夠,則會再分乙個記憶體塊,大小也是query_cache_min_res_unit。如果有多餘空閒的記憶體,就會被切割出去當作乙個自由塊。如果發現最終結果集的大小比query_cache_limit還大時,就會放棄不再快取,並把之前已經快取起來的資料也丟掉。(當然,這裡面實際的過程是相當複雜的,我這裡只是最簡單的理解)

show global 裡關於查詢快取有幾個狀態值,這裡做簡單介紹:

qcache_free_blocks :上文稱之為自由塊。其實也可以稱之為碎片,因為它沒有儲存資料空閒在那裡。最塊的情況是乙個儲存塊接著乙個空閒塊然後又是儲存塊然後又是空閒塊,這樣的話儲存塊與空閒塊的比例就是1:1,qcache_free_blocks  = qcache_total_blocks / 2, 這種情況就表明空閒塊數量太大,碎片情況非常嚴重。

qcache_free_memory:空閒記憶體。總查詢快取大小減去已經快取起來的資料大小。空閒記憶體估計的統計是包含自由塊大小在裡面的。

qcache_hits :查詢快取命中次數。只要是從查詢快取取出的結果集,qcache_hits +1.

qcache_inserts :將結果集儲存到查詢快取的次數。只要結果集符合要求就會被儲存到查詢快取中去,qcache_inserts+1

qcache_lowmem_prunes :由於查詢快取記憶體不足,使用lru策略將最近最小使用的查詢結果集從查詢快取中移出。注意:至少移出n條已經被快取起來的sql才能有足夠的記憶體來存放當前這條sql,那麼      qcache_lowmem_prunes  + n

qcache_not_cached :如果判斷產生的結果集不能被快取起來,像查詢sql含有不確定函式,如果結果集大於query_cache_limit限制,qcache_not_cached +1

qcache_queries_in_cache :當前此時此刻,查詢快取中已經儲存的查詢結果集個數。

qcache_total_blocks :當前查詢快取中,總共已分配的記憶體塊總數,包含真實儲存資料的儲存塊和自由塊。

Query cache(高速查詢緩衝池)

mysql 高速查詢快取池 簡稱qc 將select 語句和查詢結果放在緩衝區中,若有同樣的 select 語句 區分大小寫 將直接從緩衝區中讀取結果 show global status like qcache 檢視 qc可以知道 qc設定時候合理 如果 qcache lowmem prunes ...

query cache的儲存方式

當查詢進行時,如果設定了query cache,mysql會把查詢的結果儲存在qc中。儲存並不是在結果集完全得到的時候進行的,而是一邊檢索一邊儲存,mysql每次會分配一塊大小為query cache min res unit的記憶體用於儲存結果集,當使用完之後再分配一塊,所以如果結果集大於quer...

MySQL的Query Cache原理分析

querycache 下面簡稱qc 是根據sql語句來cache的。乙個sql查詢如果以select開頭,那麼mysql伺服器將嘗試對其使用qc。每個cache都是以sql文字作為key來存的。工作原理 查詢快取的工作原理,基本上可以概括為 查詢快取對什麼樣的查詢語句,無法快取其記錄集,大致有以下幾...