Mysql 查詢緩存利弊


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM