查詢緩存(QueryCache)保存查詢返回的完整結果。當查詢命中該緩存,MySQL會立即返回結果,跳過解析、優化和執行階段。
官方在特定環境測試結果(官方文檔中有詳細說明):
1.如果對某表進行簡單查詢,但每次查詢條件都不一樣時,打開查詢緩存會導致性能下降13%。
2.如對一個只有一行數據的表進行查詢,則可以提升238%。
所以查詢緩存特別適用於更新頻率非常低、查詢頻率非常高的場景。
緩存命中規則
緩存存放在一個引用表中,通過一個哈希值引用,哈希值包含了(查詢本身、當前查詢的數據庫、客戶端協議的版本等)。
判斷是否命中時,MySQL不會解析語句,而是直接使用SQL語句和客戶端發送來的其他原始信息。任何字符上的不同都會導致緩存不命中。
如果查詢語句中包含任何的不確定函數則不會緩存(如NOW()),因為在執行這個查詢之后,MySQL會禁止緩存該查詢,所以在查詢緩存中是不可能找到緩存結果的。
什么情況下查詢緩存能發揮作用
並不是所有情況下查詢緩存都能提高系統性能。打開查詢緩存對讀和寫操作都會帶來額外消耗:
- 讀查詢在開始之前必須先檢查是否命中緩存。
- 如果這個讀查詢可以被緩存,那么當完成執行后,需要將結果存入緩存。
- 每次寫入操作時,需要將對應表的所有緩存都設置失效。如果緩存較大或碎片很多,則會帶來很大消耗。
緩存命中率:
SHOW STATUS中能提供一個全局的性能指標用以計算緩存命中率:
每次SELECT查詢,要么增加Qcache_hits(查詢緩存命中次數),要么增加Com_select(無緩存的查詢次數+錯誤查詢+權限檢查查詢),所以命中率計算公式:Qcache_hits / (Qcache_hits + Com_select)。
緩存配置和維護
query_cache_type:是否打開查詢緩存。可以設置為(OFF、ON、DEMAND)。DEMAND表示只有在查詢語句中明確標記SQL_CACHE的語句才放入查詢緩存。
query_cache_size:查詢緩存使用總空間。
query_cache_min_res_unit:在查詢緩存中分配內存塊的最小單位。
query_cache_limit:MySQL能緩存的最大查詢結果。
query_cache_wlock_invalidate:如果某個數據表被其他的連接鎖住,是否仍然從查詢緩存中返回結果。
指定MySQL查詢緩沖區的大小。可以通過在MySQL控制台執行以下命令觀察:
SHOW VARIABLES LIKE '%query_cache%';
SHOW STATUS LIKE 'Qcache%';