mysql查詢快取簡單了解下唄

2021-08-21 11:55:24 字數 2660 閱讀 6564

在解析乙個查詢語句前,如果查詢快取是開啟的,那麼mysql會檢查這個查詢語句是否命中查詢快取中的資料。如果當前查詢恰好命中查詢快取,在檢查一次使用者許可權後直接返回快取中的結果。這種情況下,查詢不會被解析,也不會生成執行計畫,更不會執行。

mysql將快取存放在乙個引用表(不要理解成table,可以認為是類似於hashmap的資料結構),通過乙個雜湊值索引,這個雜湊值通過查詢本身、當前要查詢的資料庫、客戶端協議版本號等一些可能影響結果的資訊計算得來。所以兩個查詢在任何字元上的不同(例如:空格、注釋),都會導致快取不會命中。

如果查詢中包含任何使用者自定義函式、儲存函式、使用者變數、臨時表、mysql庫中的系統表,其查詢結果都不會被快取。比如函式now()或者current_date()會因為不同的查詢時間,返回不同的查詢結果,再比如包含current_user或者connecion_id()的查詢語句會因為不同的使用者而返回不同的結果,將這樣的查詢結果快取起來沒有任何的意義。

既然是快取,就會失效,那查詢快取何時失效呢?mysql的查詢快取系統會跟蹤查詢中涉及的每個表,如果這些表(資料或結構)發生變化,那麼和這張表相關的所有快取資料都將失效。正因為如此,在任何的寫操作時,mysql必須將對應表的所有快取都設定為失效。如果查詢快取非常大或者碎片很多,這個操作就可能帶來很大的系統消耗,甚至導致系統僵死一會兒。而且查詢快取對系統的額外消耗也不僅僅在寫操作,讀操作也不例外,首先,任何的查詢語句在開始之前都必須經過檢查,即使這條sql語句永遠不會命中快取,其次,如果查詢結果可以被快取,那麼執行完成後,會將結果存入快取,也會帶來額外的系統消耗。

基於此,我們要知道並不是什麼情況下查詢快取都會提高系統效能,快取和失效都會帶來額外消耗,只有當快取帶來的資源節約大於其本身消耗的資源時,才會給系統帶來效能提公升。但要如何評估開啟快取是否能夠帶來效能提公升是一件非常困難的事情,也不在本文討論的範疇內。如果系統確實存在一些效能問題,可以嘗試開啟查詢快取,並在資料庫設計上做一些優化,例如:

用多個小表代替乙個大表,注意不要過度設計

批量插入代替迴圈單條插入

合理控制快取空間大小,一般來說其大小設定為幾十兆比較合適

可以通過sql_cachesql_no_cache來控制某個查詢語句是否需要進行快取

最後的忠告是不要輕易開啟查詢快取,特別是寫密集型應用。如果你實在是忍不住,可以將query_cache_type設定為demand,這時只有加入sql_cache的查詢才會走快取,其他查詢則不會,這樣可以非常自由地控制哪些查詢需要被快取。

查詢快取型別,有0、1、2三個取值。0則不使用查詢快取。1表示始終使用查詢快取。2表示按需使用查詢快取。 

如果query_cache_type為1而又不想利用查詢快取中的資料,可以用下面的sql: 

select sql_no_cache * from my_table where condition;

如果值為2,要使用快取的話,需要使用sql_cache開關引數:

select sql_cache * from my_table where condition;

query_cache_size

預設情況下query_cache_size為0,表示為查詢快取預留的記憶體為0,則無法使用查詢快取。所以我們需要設定query_cache_size的值: 

set global query_cache_size = 134217728;

注意上面的值如果設得太小不會生效。比如我用下面的sql設定query_cache_size大小: 

咱們再來看下清理這些快取的三個sql:

1、flush query cache; // 清理查詢快取記憶體碎片。

2、reset query cache; // 從查詢快取中移出所有查詢。

3、flush tables; //關閉所有開啟的表,同時該操作將會清空查詢快取中的內容。

當然查詢快取系統本身是非常複雜的,這裡討論的也只是很小的一部分,其他更深入的話題,比如:快取是如何使用記憶體的?如何控制記憶體的碎片化?事務對查詢快取有何影響等等,咱們在這裡也沒有辦法詳細討論。如果有興趣的可以自己研究下,小弟後期會陸續更新自己的部落格來討論這些問題的。

好啦,本次就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。

多執行緒學習 簡單了解下

簡單了解下多工相關 多工不管是單核還是多核cpu,一單任務數量超過核數,os都會把每個任務輪流排程到每個核心上,os實現多執行緒和多程序往往都是通過時間片的形式執行的,即 每個任務 程序 執行緒 輪流執行,因為時間片切分的很小,以至於我們感覺多個任務在同時執行。實現多工方式 多程序模式,多執行緒模式...

簡單的了解下專案開發的流程

專案流程 首先要做的是市場調研,每個產品的出現都是市場需要的推動而出現的,所以做專案之前要對有關的背景和市場了解充分。接下來是正題.一 立項階段 確定專案經理,分配大概的資源 人力,成本,辦公場地,伺服器等 制定專案計畫 概覽版 二 需求調研階段 細化專案計畫 需求人員與甲方的業務人員溝通和討論業務...

快取穿透?了解下布隆過濾器

布隆過濾器,英文叫bloomfilter,可以說是乙個二進位制向量和一系列隨機對映函式實現。可以用於檢索乙個元素是否在乙個集合中。下面來看看布隆過濾器是如何判斷元素在乙個集合中,如下圖 有三個hash函式和乙個位陣列,oracle經過三個hash函式,得到第1 4 5位為1,database同理得到...