Mysql 查詢緩存總結
MySQL查詢緩存解釋
緩存完整的SELECT查詢結果,也就是查詢緩存。保存查詢返回的完整結果。當查詢命中該緩存,mysql會立刻返回結果,跳過了解析、優化和執行階段,
查詢緩存系統會跟蹤查詢中涉及的每個表,如果這些表發生變化,那么和這個表相關的所有數據都將失效
命中條件
Mysql判斷緩存命中的方法很簡單:緩存存放在一個引用表中,通過一個哈希值引用,這個哈希值包括如下因素,即查詢本身、當前要查詢的數據庫、客戶端協議的版本等一些都有可能影響返回結果信息。
當判斷查詢緩存是否命中時,Mysql不會解析、正規化或者參數化的查詢語句,而是直接使用Sql語句和客戶端發送過來的其他原始信息(Sql)。任何字符上的不同,例如注釋,任何的不同都會導致緩存不命中,所以在編寫Sql語句的時候,需要特別注意這一點,通常使用統一的編碼規則是一個好的習慣,在這里這個好習慣可能讓你的系統運行的更快
當查詢語句有一些不確定的數據時,則不會被緩存,例如白喊函數NOW()或者CURRENTDATE()的查詢不會被緩存
如果查詢語句中包含任何不確定的函數,那么在查詢緩存中是不可能找到緩存結果的,即使之前剛剛執行這樣的查詢
導致沒有命中條件
1、緩存碎片
2、內存不足
3、數據修改
特別注意
Mysql的查詢緩存在很多時候可以提升查詢性能,在使用的時候,有一些問題需要特別注意。首先,打開查詢緩存對 讀,寫 操作都會帶來額外的消耗:
1、讀查詢在開始之前必須先檢查是否命中緩存
2、如果這個讀查詢可以被緩存,那么當完成執行后,Mysql若發現查詢緩存中沒有這個查詢,會將其結果存入查詢緩存,這會帶來額外的系統開銷
3、這對寫操作也會影響,因為當向某個表寫入數據的時候,Mysql必須將對應表的所有緩存都設置失效。
4、對於存儲引擎InnoDB用戶來說,事務的一些特性會限制查詢緩存的作用。當一個語句在事務中修改某個表,Mysql會將這個表對應的查詢緩存都設置失效。在事務提交前該表的查詢都無法被緩存,只能在事務提交后才能被緩存。因此長時間運行的事務,會大大降低查詢緩存的命中率
5、inner JOIN 和 其他連接 查詢 如果其中一個表數據發生變化 則直接導致 緩存失效
緩存配置參數
query_cache_type: 是否打開緩存
可選項
1) OFF: 關閉
2) ON: 總是打開
3) DEMAND: 只有明確寫了SQL_CACHE的查詢才會吸入緩存
如果不想所有查詢都進入查詢緩存,但是又希望某些查詢走查詢緩存,那么可以將 query_cache_type 設置成 DEMAND ,然后在希望緩存的查詢上加上SQL_CACHE。這雖然需要在查詢中加入額外的語法,但是可以讓你非常自由的控制那些查詢需要被緩存。相反如果不希望緩存 加上SQL_NO_CACHE