mysql 快取 mysql 快取機制解讀

2021-10-25 14:03:50 字數 1797 閱讀 3519

首先講解一下,快取的原理:

快取存在乙個hash表中,通過查詢sql,查詢資料庫,客戶端協議等作為key,在判斷命中前,

命中條件:

1)mysql不會解析sql,而是使用sql去查詢快取,

2)sql上的任何字元的不同,如空格,注釋,都會導致快取不命中。

3)如果查詢有不確定的資料like now(),current_date(),

4)那麼查詢完成後結果者不會被快取,包含不確定的數的是不會放置到快取中。

5)當某個表正在寫入資料,則這個表的快取(命中快取,快取寫入等)將會處於失效狀態,在innodb中,如果某個事務修改了這張表,則這個表的快取在事務提交前都會處於失效狀態,在這個事務提交前,這個表的相關查詢都無法被快取。

2,快取的記憶體管理

快取會在記憶體中開闢一塊記憶體(query_cache_size)來維護快取資料,其中大概有40k的空間是用來維護快取資料的元資料的,例如空間記憶體,例如空間記憶體,資料表和查詢結果對映,sql和查詢結果對映的。

mysql將這個大記憶體塊分為小記憶體塊(query_cache_min_res_unit),每個小塊中儲存自身的型別、大小和查詢結果資料,還有前後記憶體塊的指標。

mysql需要設定單個小儲存塊大小,在sql查詢開始(還未得到結果)時就去申請一塊記憶體空間,所以即使你的快取資料沒有達到這個大小也需要這個大小的資料塊去儲存(like linux filesystem』s block)。如果超出這個記憶體塊的大小,則需要再申請乙個記憶體塊。當查詢完成發現申請的記憶體有富餘,則會將富餘的記憶體空間是放點,這就會造成記憶體碎片的問題,

3,怎樣開啟快取

show variables like "%query_cache_type%"

1) off: 關閉

2) on: 總是開啟

3) demand: 只有明確寫了sql_cache的查詢才會吸入快取

檢視相關配置:query_cache_size: 快取使用的總記憶體空間大小,單位是位元組,這個值必須是1024的整數倍,否則mysql實際分配可能跟這個數值不同(感覺這個應該跟檔案系統的blcok大小有關)

query_cache_min_res_unit: 分配記憶體塊時的最小單位大小

query_cache_limit: mysql能夠快取的最大結果,如果超出,則增加 qcache_not_cached的值,並刪除查詢結果

query_cache_wlock_invalidate: 如果某個資料表被鎖住,是否仍然從快取中返回資料,預設是off,表示仍然可以返回

qcache_free_blocks: 快取池中空閒塊的個數

qcache_free_memory: 快取中空閒記憶體量

qcache_hits: 快取命中次數

qcache_inserts: 快取寫入次數

qcache_lowmen_prunes: 因記憶體不足刪除快取次數

qcache_not_cached: 查詢未被快取次數,例如查詢結果超出快取塊大小,查詢中包含可變函式等

qcache_queries_in_cache: 當前快取中快取的sql數量

qcache_total_blocks: 快取總block數

快取堆積帶來的影響:

解決方案:減少碎片化;選擇合適的block大小

使用 flush query cache 命令整理碎片.這個命令在整理快取期間,會導致其他連線無法使用查詢快取

ps: 清空快取的命令式 reset query cache

然後看乙個很經典的例子:

這裡這條sql很明顯加入了快取並且快取已經命中,而下面就沒有,這裡證明這點:

sql上的任何字元的不同,如空格,注釋,都會導致快取不命中。

mysql寫快取 mysql快取機制 寫快取篇

前一篇的部落格對innodb的讀快取做了解讀。那麼innodb是否只有對讀取做了優化呢?對於我所從事的網路遊戲業務而言,的確是乙個讀多寫少的場景,但是並不意味著所有場景都是如此。首先的一點,資料庫需要保證安全性,所以每一次寫入資料庫的時候,都會產生redo log,用來在資料庫崩潰的時候進行回滾,同...

mysql 快取設定 mysql快取設定

伺服器端的設定 mysql優化首先要知道mysql快取是如何工作以及如何設定,下面是我從別人部落格上覆制過來了,初學者。mysql每個表都可以表示為磁碟上的乙個檔案,必須先開啟,後讀取。為了加快從檔案中讀取資料的過程,mysqld 對這些開啟檔案進行了快取,其最大數目由 etc mysqld.con...

mysql 快取策略 Mysql的快取機制

參考 mysql的快取功能 對於乙個並沒有那麼複雜的系統,但是某幾個表特別大的時候,快取是乙個很實用的乙個功能,是sql優化和查詢提速的常用操作,開啟mysql自帶的此功能,實現查詢結果快取的同時,快取失效的維護由資料庫自己完成,而不像一般的spring框架要通過 或者過期自動超時來維護。當然,這個...