MYSQL筆記(MySQL查詢快取)

2021-08-25 14:57:09 字數 1572 閱讀 7337

查詢快取儲存了完整的select結果集;這樣當乙個相同的查詢到達時,可伺服器可以跳過解析、優化、執行等階段,直接把結果返回給客戶端,但某種意義上講,查詢快取實際上修改了應用程式請求的語義,例如,即使在lock tables的情況下,查詢也能被快取下來。

在伺服器端維護了乙個查詢表,查詢的鍵是查詢文字、資料庫和客戶端協議版本及其他影響實際查詢結果的因素,綜合起來的雜湊值,也就是說,只要客戶端的查詢語句有絲毫的差異,都不會命中快取,或者查詢語句相同,但不同的客戶端協議版本也可能無法命中查詢快取;

此外一些有不確定結果的查詢,如now()、current_date()這樣的函式,查詢結果不會被快取;不會快取的情況包括

1.使用者自定義函式

2.儲存函式

3.使用者自定義變數

4.臨時表

5.任何乙個有列級許可權的表的查詢

在執行的過程中,mysql一旦發現有阻止快取的元素存在,就將其標記為不可快取。

在innodb中,當事務內部改寫了表,雖然多版本機制應當對其他語句隱藏變化,但這裡卻會使所有引用了該錶的查詢快取失效,直到事務提交之前,該錶都是全域性不可快取的。

當乙個請求查詢快取的時,將會阻塞所有訪問快取的查詢。

快取內容儲存在記憶體中,查詢快取具有乙個記憶體池,這在伺服器啟動時進行初始化,分配給查詢快取的大小是可配置的,除了查詢快取本身固定需要的40kb空間,其他都用於記憶體池。

由於伺服器是逐行傳送結果的,在執行完畢前,無法知道快取需要的記憶體大小,因此,當需要快取結果時,會先從池中獲取乙個至少query_cache_min_res_unit大小的塊,將資料寫入其中,當還有剩餘資料時,就需要另外申請新塊,繼續加入資料,最後,當儲存完畢後,如果資料塊還沒存滿,就會將空的部分截出來,加入到剩餘的空閒空間中。

在上述過程中,可能會產生很多碎片,這些碎片因為低於最小限制,無法重複使用,可以通過命令flush query cache來移除碎片。

在檔案sql/sql_cache.cc中對上述過程進行了具體的描述。

在status變數列表裡,qcache_hits記錄了命中次數,另外還有qcache_inserts記錄儲存快取的次數,qcache_free_blocks記錄了空閒塊數

關於查詢快取,用到的幾個全域性變數包括:

1.query_cache_type,表示快取是否被啟用,off、on、demand(該選項意味著只有包含了sql_cache選項的查詢才會被快取);

2.query_cache_size,分配給查詢快取的大小;

3.query_cache_min_res_unit,分配快取塊的最小值;

4.query_cache_limit,儲存結果最大值,若超過了會丟棄已快取的值,因此當預知到可能結果超出時,最好加上選項sql_no_cache,避免額外開銷;

5.query_cache_wlock_invalidate,預設為off,可以讀取已鎖定的表的快取資料

通用的查詢快取優化方案:

1.盡量使用多個小表而非大表;

2.成批進行寫入操作而非逐個執行;

3.設定合適的query_cache_size值;

4.使用sql_cache和sql_no_cache來決定是否快取查詢;

5.對很多寫入任務的應用程式,關閉查詢快取。

MYSQL筆記(MySQL查詢快取)

查詢快取儲存了完整的select結果集 這樣當乙個相同的查詢到達時,可伺服器可以跳過解析 優化 執行等階段,直接把結果返回給客戶端,但某種意義上講,查詢快取實際上修改了應用程式請求的語義,例如,即使在lock tables的情況下,查詢也能被快取下來。在伺服器端維護了乙個查詢表,查詢的鍵是查詢文字 ...

(MySQL筆記)MySQL子查詢

mysql的select語句中支援子查詢。子查詢是將乙個select語句的查詢結果作為中間結果,供另乙個select語句查詢呼叫,子查詢也叫做子選擇或者巢狀選擇。如 select studentno from select studentno,from student where age 18 as...

MySQL筆記 MySQL多表查詢

主鍵 一張從表中某個字段引用主表中的主鍵,維護多表之間的關係 從表 使用別人資料的表,被主表約束 級聯兩個表,乙個表的關鍵字段進行修改,另乙個表也會隨之修改 constraint 外來鍵約束名 foreign key 外來鍵字段 references 主表名 字段 刪除外來鍵 alter table...