阿里云RDS for MySQL查詢緩存(Query Cache)的設(shè)置和使用
功能和適用范圍
功能:
?降低CPU使用率。
?降低IOPS使用率(某些情況下)。
?減少查詢響應(yīng)時間,提高系統(tǒng)的吞吐量。
適用范圍:
?表數(shù)據(jù)修改不頻繁、數(shù)據(jù)較靜態(tài)。
?查詢(Select)重復(fù)度高。
?查詢結(jié)果集小于 1 MB。
說明 查詢緩存并不一定帶來性能上的提升,在某些情況下(比如查詢數(shù)量大,但重復(fù)的查詢很少)開啟查詢緩存會帶來性能的下降。
原理
RDS for MySQL對來自客戶端的查詢(Select)進行Hash計算得到該查詢的Hash值,通過該Hash值到查詢緩存中匹配該查詢的結(jié)果。
如果匹配(命中),則將查詢的結(jié)果集直接返回給客戶端,不必再解析、執(zhí)行查詢。
如果沒有匹配(命中),則將Hash值和結(jié)果集保存在查詢緩存中,以便以后使用。
查詢涉及的任何一個表中數(shù)據(jù)發(fā)生變化,RDS for MySQL將查詢緩存中所有與該表相關(guān)的查詢結(jié)果集全部釋放(刪除)。
限制
?查詢必須嚴格一致(大小寫、空格、使用的數(shù)據(jù)庫、協(xié)議版本、字符集等必須一致)才可以命中,否則視為不同查詢。
?不緩存查詢中的子查詢結(jié)果集,僅緩存查詢最終結(jié)果集。
?不緩存存儲函數(shù)(Stored Function)、存儲過程(Stored Procedure)、觸發(fā)器(Trigger)、事件(Event)中的查詢。
?不緩存含有每次執(zhí)行結(jié)果變化的函數(shù)的查詢,比如now()、curdate()、last_insert_id()、rand()等。
?不緩存對mysql、information_schema、performance_schema系統(tǒng)數(shù)據(jù)庫表的查詢。
?不緩存使用臨時表的查詢。
?不緩存產(chǎn)生告警(Warnings)的查詢。
?不緩存Select … lock in share mode、Select … for update、 Select * from … where autoincrement_col is NULL類型的查詢。
?不緩存使用用戶定義變量的查詢。
?不緩存使用Hint - SQL_NO_CACHE的查詢。
設(shè)置
?參數(shù)設(shè)置
控制臺參數(shù)設(shè)置如下。
?query_cache_limit(單位:byte):查詢緩存中可存放的單條查詢最大結(jié)果集,默認為 1 MB;超過該大小的結(jié)果集不被緩存。
?query_cache_size(單位:byte):查詢緩存的大小,默認為 3 MB。
?query_cache_type:是否開啟查詢緩存功能。
取值為 0 :關(guān)閉查詢功能。
取值為 1 :開啟查詢緩存功能,但不緩存Select SQL_NO_CACHE開頭的查詢。
取值為 2 :開啟查詢緩存功能,但僅緩存Select SQL_CACHE開頭的查詢。
說明
?修改query_cache_type需要重啟實例(修改后實例會自動重啟)。
?參數(shù)query_cache_size要求設(shè)置值為1024的整數(shù)倍,否則會提示指定參數(shù)無效。
?開啟
參數(shù)query_cache_size大于0并且query_cache_type設(shè)置為1或者2的情況下,查詢緩存開啟。
?關(guān)閉
設(shè)置參數(shù)query_cache_size為0或者設(shè)置query_cache_type為0關(guān)閉查詢緩存。
?建議
?query_cache_size不建議設(shè)置的過大。過大的空間不但擠占實例其他內(nèi)存結(jié)構(gòu)的空間,而且會增加在緩存中搜索的開銷。建議根據(jù)實例規(guī)格,初始值設(shè)置為10MB到100 MB之間的值,而后根據(jù)運行使用情況調(diào)整。
?建議通過調(diào)整query_cache_size的值來開啟、關(guān)閉查詢緩存,因為修改query_cache_type參數(shù)需要重啟實例生效。
?查詢緩存適用于特定的場景,建議充分測試后,再考慮開啟,避免引起性能下降或引入其他問題。
驗證效果
?控制臺
?SQL命令
可以通過如下命令來獲取查詢緩存的使用狀態(tài)。
show global status like ‘Qca%’;
?Qcache_hits:查詢緩存命中次數(shù)。
?Qcache_inserts:將查詢和結(jié)果集寫入到查詢緩存中的次數(shù)。
?Qcache_not_cached:不可以緩存的查詢次數(shù)。
?Qcache_queries_in_cache:查詢緩存中緩存的查詢量。