原理與作用
當一個請求到達MySQL后,先到查詢緩存查看是否以前執行過該語句。之前執行過的語句及其結果可能會以 key-value 對的形式,被直接緩存在內存中。key 是查詢的語句,value 是查詢的結果。如果你的查詢能夠直接在這個緩存中找到 key,就會將 value被直接返回給客戶端。
如果語句在查詢緩存中不命中,就會繼續正常的查詢過程。執行完成后,將執行結果作為value,將查詢語句作為key存入查詢緩存。
可以看到,如果查詢命中緩存,MySQL 不需要執行后面的復雜操作,就可以直接返回結果,這個效率會很高。
建議
大多數情況下不要使用查詢緩存,因為查詢緩存往往弊大于利。
查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。因此很可能你費勁地把查詢結果緩存起來,還沒使用呢,就被一個更新全清空了。對于更新比較頻繁的數據庫來說,查詢緩存的命中率非常低。
需要注意的是,MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了,也就是說 8.0 開始徹底沒有這個功能了
使用場景
對于寫少讀多的場景比較適用。比如,一個系統配置表,那這張表上的查詢才適合使用查詢緩存。
MySQL 也提供了這種“按需使用”的方式。你可以將參數 query_cache_type 設置成 DEMAND,這樣對于默認的 SQL 語句都不使用查詢緩存。而對于你確定要使用查詢緩存的語句,可以用 SQL_CACHE 顯式指定,像下面這個語句一樣:
select SQL_CACHE * from Table1 where ID=10;