mysql 快取機制

2021-09-12 19:46:39 字數 2788 閱讀 6453

mysql快取機制就是快取sql 文字及快取結果,用kv形式儲存再伺服器記憶體中,如果執行相同的sql,伺服器直接從快取中去獲取結果,不需要在再去解析、優化、執行sql。 如果這個表修改了,那麼使用這個表中的所有快取將不再有效,查詢快取值得相關條目將被清空。表中得任何改變是值表中任何資料或者是結構的改變,包括insert,update,delete,truncate,alter table,drop table或者是drop database 包括那些對映到改變了的表的使用merge表的查詢,顯然,者對於頻繁更新的表,查詢快取不合適,對於一些不變的資料且有大量相同sql查詢的表,查詢快取會節省很大的效能。

快取存在乙個hash表中,通過查詢sql,查詢資料庫,客戶端協議等作為key,在判斷命中前,mysql不會解析sql,而是使用sql去查詢快取,sql上的任何字元的不同,如空格,注釋,都會導致快取不命中。如果查詢有不確定的資料like now(),current_date(),那麼查詢完成後結果者不會被快取,包含不確定的數的是不會放置到快取中。

1.伺服器接收sql,以sql和一些其他條件為key查詢快取表

2.如果找到了快取,則直接返回快取

3.如果沒有找到快取,則執行sql查詢,包括原來的sql解析,優化等。

4.執行完sql查詢結果以後,將sql查詢結果快取入快取表

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

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

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

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

衡量開啟快取是否對系統有效能提公升是乙個很難的話題

通過快取命中率判斷, 快取命中率 = 快取命中次數 (qcache_hits) / 查詢次數 (com_select)

通過快取寫入率, 寫入率 = 快取寫入次數 (qcache_inserts) / 查詢次數 (qcache_inserts)

通過 命中-寫入率 判斷, 比率 = 命中次數 (qcache_hits) / 寫入次數 (qcache_inserts), 高效能mysql中稱之為比較能反映效能提公升的指數,一般來說達到3:1則算是查詢快取有效,而最好能夠達到10:1

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,表示仍然可以返回

global staus 中 關於 快取的引數解釋:

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

innodb會對每個表設定乙個事務計數器,裡面儲存當前最大的事務id.當乙個事務提交時,innodb會使用mvcc中系統事務id最大的事務id跟新當前表的計數器.

只有比這個最大id大的事務能使用查詢快取,其他比這個id小的事務則不能使用查詢快取.

另外,在innodb中,所有有加鎖操作的事務都不使用任何查詢快取

查詢必須是完全相同的(逐字節相同)才能夠被認為是相同的。另外,同樣的查詢字串由於其它原因可能認為是不同的。使用不同的資料庫、不同的協議版本或者不同 預設字符集的查詢被認為是不同的查詢並且分別進行快取。

MySQL快取機制

對mysql查詢快取及sql server過程快取的理解及總結 一 mysql的query cache 1 query cache mysql query cache是用來快取我們所執行的select語句以及該語句的結果集。mysql在實現query cache的具體技術細節上類似典型的kv儲存,就...

mysql 快取機制

目錄 2.命中條件 3.工作流程 4.快取失敗 5.快取的記憶體管理 6.快取的使用時機 7.快取引數配置 8.減少快取碎片策略 9.innodb查詢快取 10.參考 mysql快取機制即快取sql 文字及快取結果,用kv形式儲存再伺服器記憶體中,如果執行相同的sql,伺服器直接從快取中去獲取結果,...

MySQL快取機制

目錄2.命中條件 3.工作流程 4.快取失敗 5.快取的記憶體管理 6.快取的使用時機 7.快取引數配置 8.減少快取碎片策略 9.innodb查詢快取 10.參考 mysql快取機制即快取sql 文字及快取結果,用kv形式儲存再伺服器記憶體中,如果執行相同的sql,伺服器直接從快取中去獲取結果,不...