mysql 快取策略 Mysql的快取機制

2021-10-17 12:18:21 字數 2526 閱讀 5999

參考

mysql的快取功能

對於乙個並沒有那麼複雜的系統,但是某幾個表特別大的時候,快取是乙個很實用的乙個功能,是sql優化和查詢提速的常用操作,開啟mysql自帶的此功能,實現查詢結果快取的同時,快取失效的維護由資料庫自己完成,而不像一般的spring框架要通過**或者過期自動超時來維護。當然,這個功能並不適合海量資料快取,mysql快取還設計記憶體碎片的問題,需要定期手動維護。也不適合高效能資料快取的業務場景,專業的快取還是要用redis、ehcache來處理。

mysql快取維護的方式簡單暴力,只要查詢涉及的表中有更新操作,就清空該錶相關的所有快取(多表關聯查詢就更嚴重,但凡有乙個表更新了,該sql快取就失效了),基於這種邏輯就可以保證所有的資料是最新的,不用涉及超時時間的概念。當然使用快取功能會增加一部分資料的開銷,來實現熱點資料的快取快速查詢,從而提公升使用者的體驗。

結合業務場景,一般都是開啟demand模式,使用在不需要頻繁變動的表上。頻繁變更的表上如果開啟快取功能,會影響資料庫的維護效能。

mysql將快取存放在乙個引用表(不要理解成table,可以認為是類似於hashmap的資料結構),通過乙個雜湊值索引,這個雜湊值通過查詢本身、當前要查詢的資料庫、客戶端協議版本號等一些可能影響結果的資訊計算得來。所以兩個查詢在任何字元上的不同(例如:空格、注釋),都會導致快取不會命中。

既然是快取,肯定是儲存在記憶體當中,重啟後會失效。

如果這個表修改了,那麼使用這個表中的所有快取將不再有效,查詢快取值得相關條目將被清空。表中得任何改變是值表中任何資料或者是結構的改變,包括insert,update,delete,truncate,alter table,drop table或者是drop database 包括那些對映到改變了的表的使用merge表的查詢,

對於頻繁更新的表,查詢快取不合適,對於一些不變的資料且有大量相同sql查詢的表,查詢快取會節省很大的效能

快取不可用的情況:

使用快取必須確保sql完全一樣,sql字母大小寫、空格、注釋等都會導致快取匹配失敗

sql中包含不確定的函式,則快取功能不可用,比如 now(),current_date() ,比如 select * from wx_ib where war_exp_date=current_date();

快取要查詢的表,正在被另外乙個事務修改資料

注意事項:

比較遺憾的是,快取清空的機制是目標表有任何更新操作,都會導致該錶的所有快取失效,而不能實現行級別的快取清空

事務隔離級別為:serializable情況下,所有查詢語句都不能快取;

pk 其它快取

mysql清除快取的方式太過暴力,只要快取查詢的sql查詢,涉及到的表有更新操作,那麼這個快取查詢就會失效,無法實現行級的快取清除

spring整合第三方快取工具和相關註解,可以實現更靈活的快取處理,比如清除某個key的快取,而不是整個表的快取都清除

專業的快取工具一般都支援,快取資料持久化、fifo策略等功能

mysql快取功能的開啟

配置和啟動:修改mysql安裝目錄下面的my.ini檔案,新增query_cache_type=2(開啟demad模式),然後重啟mysql(windows重啟的話,admin模式 net stop mysql ,net start mysql。 linux: service mysql restart)

快取開啟的設定:query_cache_type

off: 關閉,預設 值為0

on: 總是開啟,值為1

demand: 只有明確寫了sql_cache的查詢才會進入快取,值為2

query_cache_type 這個引數windows下必須在my.ini檔案裡配置,預設是0 表示關閉快取功能,設定為1 表示開啟全部的快取,設定為2表示demand模式

query_cache_min_res_unit 設定查詢快取分配記憶體的最小單位,要適當地設定此引數,可以做到為減少記憶體塊的申請和分配次數,但是設定過大可能導致記憶體碎片數值上公升。預設值為4k,建議設定為1k~16k

qcache_hits 檢視命中快取查詢的次數

#my.ini裡面配置

query_cache_type=2

set global query_cache_limit = 1024 * 1024 * 5;

show status like '%qcache_hits%';

快取的使用: sql_no_cache/ sql_cache

select sql_cache * from wx_ib where product_id=1246 and war_exp_date='2016-08-07';

select sql_no_cache * from wx_ib where product_id=1246 and war_exp_date='2016-08-07';

快取開啟的時機:

快取開啟帶來的必要開銷:

該錶發生事務操作的時候,都要清空相關的快取

在query_cache_type為on的模式下,該資料庫全部的查詢都會先嘗試快取,不管該查詢是否會有熱點資料,而實際的業務場景並不是這樣。所以更建議使用demand模式。

開啟快取後,所有的query完成之後,都要把查詢結果插入到快取當中

Mysql 之 快取更新策略

業務角度,對於讀操作很少的,造成效能浪費 執行緒安全角度,容易產生資料髒讀 執行緒a更新了資料庫,執行緒b更新了資料庫,b更新了快取,a更新了快取 錯誤情況 請求a進行寫操作,刪除快取 請求b查詢發現快取不存在,讀取資料庫,寫入快取 請求a將資料寫入資料庫 解決方法 採用延時雙刪除法 在a寫入資料庫...

mysql 優化策略 mysql的優化策略有哪些

第一 優化你的sql和索引 1.善用explain,看看自己寫的sql到底要涉及到多少表,多少行,使用了那些索引,根據這些資訊適當的建立索引 2.善用不同的儲存引擎,mysql有多種不同的儲存引擎,innodb,aria,memory根據需要給不同的表選擇不同的儲存引擎,比如要支援transacti...

mysql 快取設定 mysql快取設定

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