功能和適用範圍
功能:
- 降低CPU使用率。
- 降低IOPS使用率(某些情況下)。
- 減少查詢回應時間,提高系統的輸送量。
適用範圍:
- 表資料修改不頻繁、資料較靜態。
- 查詢(Select)重複度高。
- 查詢結果集小於 1 MB。
說明 查詢快取並不一定帶來效能上的提升,在某些情況下(比如查詢數量大,但重複的查詢很少)開啟查詢快取會帶來效能的下降。
原理
RDS MySQL對來自用戶端的查詢(Select)進行Hash計算得到該查詢的Hash值,通過該Hash值到查詢快取中匹配該查詢的結果。
如果匹配(命中),則將查詢的結果集直接返回給用戶端,不必再解析、執行查詢。
如果沒有匹配(命中),則將Hash值和結果集儲存在查詢快取中,以便以後使用。
查詢涉及的任何一個表中資料發生變化,RDS MySQL將查詢快取中所有與該表相關的查詢結果集全部釋放(刪除)。
限制
- 查詢必須嚴格一致(大小寫、空格、使用的資料庫、協議版本、字元集等必須一致)才可以命中,否則視為不同查詢。
- 不緩衝查詢中的子查詢結果集,僅緩衝查詢最終結果集。
- 不緩衝儲存函數(Stored Function)、預存程序(Stored Procedure)、觸發器(Trigger)、事件(Event)中的查詢。
- 不緩衝含有每次執行結果變化的函數的查詢,比如now()、curdate()、last_insert_id()、rand()等。
- 不緩衝對mysql、information_schema、performance_schema系統資料庫表的查詢。
- 不緩衝使用暫存資料表的查詢。
- 不緩衝產生警示(Warnings)的查詢。
- 不緩衝Select … lock in share mode、Select … for update、 Select * from … where autoincrement_col is NULL類型的查詢。
- 不緩衝使用使用者定義變數的查詢。
- 不緩衝使用Hint - SQL_NO_CACHE的查詢。
設定
- 參數設定
控制台參數設定如下。
query_cache_limit(單位:byte):查詢快取中可存放的單條查詢最大結果集,預設為 1 MB;超過該大小的結果集不被緩衝。
query_cache_size(單位:byte):查詢快取的大小,預設為 3 MB。
query_cache_type:是否開啟查詢快取功能。
取值為 0 :關閉查詢功能。
取值為 1 :開啟查詢快取功能,但不緩衝Select SQL_NO_CACHE開頭的查詢。
取值為 2 :開啟查詢快取功能,但僅緩衝Select SQL_CACHE開頭的查詢。
重要- 修改query_cache_type需要重啟執行個體(修改後執行個體會自動重啟)。
- 參數query_cache_size要求設定值為1024的整數倍,否則會提示指定參數無效。
- 開啟
參數query_cache_size大於0並且query_cache_type設定為1或者2的情況下,查詢快取開啟。
- 關閉
設定參數query_cache_size為0或者設定query_cache_type為0關閉查詢快取。
- 建議
- query_cache_size不建議設定的過大。過大的空間不但擠占執行個體其他記憶體結構的空間,而且會增加在緩衝中搜尋的開銷。建議根據執行個體規格,初始值設定為10MB到100 MB之間的值,而後根據運行使用方式調整。
- 建議通過調整query_cache_size的值來開啟、關閉查詢快取,因為修改query_cache_type參數需要重啟執行個體生效。
- 查詢快取適用於特定的情境,建議充分測試後,再考慮開啟,避免引起效能下降或引入其他問題。
驗證效果
- 控制台
- SQL命令
可以通過如下命令來擷取查詢快取的使用狀態。
show global status like ‘Qca%’;
Qcache_hits:查詢快取叫用次數。
Qcache_inserts:將查詢和結果集寫入到查詢快取中的次數。
Qcache_not_cached:不可以緩衝的查詢次數。
Qcache_queries_in_cache:查詢快取中緩衝的查詢量。