查詢緩存
Mysql提供了一種緩存類型,會緩存整個SELECT查詢結果。Mysql查詢緩存保存查詢返回的完整結果。
當查詢命中該緩存,Mysql會立即返回結果,跳過了解析、優化和執行階段。
以下兩種情況不能被緩存:
- 頻繁更新、修改的的表,所有緩存數據都會失效,Mysql查詢緩存會跟蹤查詢中涉及的表,如果這個表數據發生變化,所有緩存數據都會失效。
- 查詢語句中包含任何不確定的函數,此查詢語句的結果是不會被緩存的。
Mysql如何緩存,以及判斷緩存命中
Mysql如何緩存
Mysql會將緩存結果放到一張引用表中,通過一個哈希值引用,這個哈希值包括:查詢語句本身,當前要查詢的數據庫、客戶端協議的版本等。
Mysql判斷緩存命中
當有查詢語句時,Mysql首先檢查查詢緩存,如果找到緩存就返回緩存,沒有找到,才會解析SQL。
1.服務器接收SQL,以SQL和一些其他條件為key查找緩存表。
2.如果找到了緩存,則直接返回緩存 。
3.如果沒有找到緩存,則執行SQL查詢,包括原來的SQL解析,優化等。
4.執行完SQL查詢結果以后,將SQL查詢結果緩存入緩存表。
開啟查詢緩存
查看是否開啟緩存及緩存配置相關參數
show variables like 'query';
緩存參數配置
如何設置參數:在my.cnf配置文件中設置
query_cache_type: 是否打開緩存 1) OFF: 關閉 2) ON: 總是打開 3) DEMAND: 只有明確寫了SQL_CACHE的查詢才會吸入緩存 query_cache_size: 緩存使用的總內存空間大小,單位是字節,這個值必須是1024的整數倍,否則MySQL實際分配可能跟這個數值不同(感覺這個應該跟文件系統的blcok大小有關) query_cache_min_res_unit: 分配內存塊時的最小單位大小 query_cache_limit: MySQL能夠緩存的最大結果,如果超出,則增加 Qcache_not_cached的值,並刪除查詢結果 query_cache_wlock_invalidate: 如果某個數據表被鎖住,是否仍然從緩存中返回數據,默認是OFF,表示仍然可以返回 GLOBAL STAUS 中 關於 緩存的參數解釋: Qcache_free_blocks: 緩存池中空閑塊的個數 Qcache_free_memory: 緩存中空閑內存量 Qcache_hits: 緩存命中次數 Qcache_inserts: 緩存寫入次數 Qcache_lowmen_prunes: 因內存不足刪除緩存次數 Qcache_not_cached: 查詢未被緩存次數,例如查詢結果超出緩存塊大小,查詢中包含可變函數等 Qcache_queries_in_cache: 當前緩存中緩存的SQL數量 Qcache_total_blocks: 緩存總block數
分析與配置緩存流程:

緩存是否應該被使用
衡量打開緩存是否對系統有性能提升是一個很難的話題
通過緩存命中率判斷, 緩存命中率 = 緩存命中次數 (Qcache_hits) / 查詢次數 (Com_select)
通過緩存寫入率, 寫入率 = 緩存寫入次數 (Qcache_inserts) / 查詢次數 (Qcache_inserts)
通過 命中-寫入率 判斷, 比率 = 命中次數 (Qcache_hits) / 寫入次數 (Qcache_inserts), 高性能MySQL中稱之為比較能反映性能提升的指數,一般來說達到3:1則算是查詢緩存有效,而最好能夠達到10:1
緩存未命中可能原因:
查詢語句無法被緩存,查詢中有不確定的函數,或者查詢結果太大而無法被緩存。
查詢緩存的內存用完了,Mysql需要緩存"逐出",或者由於數據表被修改導致緩存失效。
緩存命中率低可能原因:
查詢緩存沒有完成預熱,Mysql還沒有集合將查詢結果都緩存起來。
查詢語句之前從未執行過。
緩存失效操作太多了。
