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