首頁 >資料庫 >mysql教程 >mysql資料庫查詢快取原理是什麼

mysql資料庫查詢快取原理是什麼

coldplay.xixi
coldplay.xixi原創
2020-10-26 11:58:113761瀏覽

mysql資料庫查詢快取原則是:1、快取SELECT操作的結果集和SQL語句,key為sql,value為查詢結果集;2、如果新的SELECT語句到了,以這個sql為key去快取中查詢,如果匹配,就把快取的結果集回傳。

mysql資料庫查詢快取原理是什麼

mysql資料庫查詢快取原則是:

概述

#查詢快取(Query Cache,簡稱QC),儲存SELECT語句及其產生的資料結果。閒來無事,做一下這塊的總結,也做個備忘!

超詳細的mysql資料庫查詢快取總結,值得收藏

mysql資料庫查詢快取原理是什麼

工作原理

  • 快取SELECT操作的結果集和SQL語句,key為sql,value為查詢結果集;

  • 如果新的SELECT語句到了,以這個sql為key去快取中查詢,如果匹配,就把快取的結果集返回;

  • 匹配標準:與快取的SQL語句是否完全一樣,sql中字母區分大小寫以及中間的空格,簡單理解為儲存了一個key-value結構,key為sql,value為sql查詢結果,匹配時使用Java的String的equals(),例如:

  • select age from user 與select AGE from user不會匹配,因為大小寫不同;

  • select age from use 與select age from user不會匹配,因為空格不同;

  • sql兩邊的空格可忽略,可以認為是對key進行過trim操作之後再進行equals比較。

查看mysql設定參數

執行

show variables like '%query_cache%';

mysql資料庫查詢快取原理是什麼

#可以看到相關參數:

  • query_cache_type:0-不啟用查詢快取;1-啟用,2-啟用,預設值為0; 

  • query_cache_size:設定快取區總大小,允許設定query_cache_size的值最小為40K,預設1M,建議設定為:64M/128M;

  • query_cache_limit:限制快取區最大能快取的單一查詢記錄集大小,預設為1M

  • query_cache_type為1時,只要符合查詢快取的要求,客戶端的查詢語句和記錄集合都可以快取起來,如果SQL加上SQL_NO_CACHE將不會快取;

  • query_cache_type為2時,只要SQL新增了參數:SQL_CACHE,並且符合查詢快取的要求,客戶端的查詢語句和記錄集,則可以快取起來。

查看快取使用量

show status like '%Qcache%%';

mysql資料庫查詢快取原理是什麼

可以看到相關參數:

  • Qcache_hits:快取命中次數;

  • Qcache_inserts:快取中插入次數,每個快取一次加1,注意這個不是快取數量;

#開啟查詢快取

#設定選項query_cache_type = 1 ,同時設定query_cache_size = 67108864;

附註:query_cache_size的值設定在100MB以內即可。在MySQL裡查詢快取是由一個全域鎖在控制,每次更新查詢快取的記憶體區塊都需要鎖定。

關閉查詢快取

設定選項query_cache_type = 0,同時設定query_cache_size = 0。

適用場景

用於頻繁提交同一個語句,並且該表資料變化不是很頻繁的場景,例如一些靜態頁面,或頁面中的某塊不經常發生變化的資訊。

由於查詢快取需要快取最新資料結果,因此表格資料發生任何變更(insert、update、delete或其他可能產生資料變更的操作),都會導致查詢快取被刷新。因而,對於一個更新頻率非常低而只讀查詢頻率非常高的場景下,開啟查詢快取還是比較有優勢的。

不適用場景

查詢快取嚴格要求2次SQL請求要完全一樣,包括SQL語句,連接的資料庫、協定版本、字元集等因素都會影響。以下為查詢快取不適用的幾個場景:

  • 子查詢;

  • #過程、函數、觸發器、event中呼叫的SQL ,或引用到這些結果的;

  • 查詢中涉及一些特殊函數時,例如:BENCHMARK()、CURDATE()、CURRENT_TIME()、CURRENT_TIMESTAMP()、NOW()、 SLEEP()、CONNECTION_ID()、CURRENT_DATE()、CURRENT_USER()、PASSWORD()、RAND()、UUID()、ENCRYPT()、LAST_INSERT_ID()等等;

  • 查詢涉及mysql,information_schema或performance_schema。

  • 類似SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE、SELECT..INTO OUTFILE/DUMPFILE、SELECT * FROM ... WHERE autoincrement_col IS NULL的查詢;

  • SELECT執行計畫用到暫存資料表;

  • 不引用任何資料表的查詢,例如SELECT 1 2;

  • 查詢產生了警告(warnings);

  • SELECT語句中存在SQL_NO_CACHE關鍵字;

  • 涉及到分區表。

更多相關免費學習推薦:mysql教學(影片)

以上是mysql資料庫查詢快取原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn