mysql的查詢快取說明

2022-09-29 17:24:14 字數 3258 閱讀 3121

對mysql查詢快取從五個角度進行詳細的分析:query cache的工作原理、如何配置、如何維護、如何判斷查詢快取的效能、適合的業務場景分析。

工作原理

查詢快取的工作原理,基本上可以概括為:

快取sel程式設計客棧ect操作或預處理查詢(注釋:5.1.17開始支援)的結果集和sql語句;

新的select語句或預處理查詢語句,先去查詢快取,判斷是否存在可用的記錄集,判斷標準:與快取的sql語句,是否完全一樣,區分大小寫;

查詢快取對什麼樣的查詢語句,無法快取其記錄集,大致有以下幾類:

查詢語句中加了sql_no_cache引數;

查詢語句中含有獲得值的函式,包涵自定義函式,如:curdate()、get_lock()、rand()、conve等;

對系統資料庫的查詢:mysql、information_schema

查詢語句中使用session級別變數或儲存過程中的區域性變數;

查詢語句中使用了lock  in share mode、for update的語句

查詢語句中類似select …into 匯出資料的語句;

事務隔離級別為:serializable情況下,所有查詢語句都不能快取;

對臨時表的查詢操作;

存在警告資訊的查詢語句;

不涉及任何表或檢視的查詢語句;

某使用者只有列級別許可權的查詢語句;

查詢快取的優缺點:

不需要對sql語句做任何解析和執行,當然語法解析必須通過在先,直接從query  cache中獲得查詢結果;

查詢快取的判斷規則,不夠智慧型,也即提高了查詢快取的使用門檻,降低其效率;

query cache的起用,會增加檢查和清理query cache中記錄集的開銷,而且存在sql語句快取的表,每一張表都只有乙個對應的全域性鎖;

配置是否啟用mysql查詢快取,可以通過2個引數:query_cache_type和query_cache_size,其中任何乙個引數設定為0都意味著關閉查詢快取功能,但是正確的設定推薦query_cache_type=0。

query_cache_type

值域為:0 -– 不啟用查詢快取程式設計客棧;

值域為:1 -– 啟用查詢快取,只要符合查詢快取的要求,客戶端的查詢語句和記錄集鬥可以

快取起來,共其他客戶端使用;

值域為:2 -– 啟用查詢快取,只要查詢語句中新增了引數:sql_cache,且符合查詢快取的要求,客戶端的查詢語句和記錄集,則可以快取起來,共其他客戶端使用;

query_cache_size

允許設定query_cache_size的值最小為40k,對於最大值則可以幾乎認為無限制,實際生產環境的應用經驗告訴我們,該值並不是越大, 查詢快取的命中率就越高,也不是對伺服器負載下降貢獻大,反而可能抵消其帶來的好處,甚至增加伺服器的負載,至於該如何設定,下面的章節講www.cppcns.com述,推薦設定 為:64m;

query_cache_limit

限制查詢快取區最大能快取的查詢記錄集,可以避免乙個大的查詢記錄集占去大量的記憶體區域,而且往往小查詢記錄集是最有效的快取記錄集,預設設定為1m,建議修改為16k~1024k之間的值域,不過最重要的是根據自己應用的實際情況進行分析、預估來設定;

query_cache_min_res_unit

設定查詢快取分配記憶體的最小單位,要適當地設定此引數,可以做到為減少記憶體塊的申請和分配次數,但是設定過大可能導致記憶體碎片數值上公升。預設值為4k,建議設定為1k~16k

query_cache_wlock_invalidate

該引數主要涉及myisam引擎,若乙個客戶端對某錶加了寫鎖,其他客戶端發起的查詢請求,且查詢語句有對應的查詢快取記錄,是否允許直接讀取查詢快取的記錄集資訊,還是等待寫鎖的釋放。預設設定為0,也即允許;

維護查詢緩區的碎片整理

查詢快取使用一段時間之後,一般都會出現記憶體碎片,為此需要監控相關狀態值,並且定期進行記憶體碎片的整理,碎片整理的操作語句:flush query cache;

清空查詢快取的資料

那些操作操作可能觸發查詢快取,把所有快取的資訊清空,以避免觸發或需要的時候,知道如何做,二類可觸發查詢快取資料全部清空的命令:

(1).reset query cache;

(2).flush tables;

效能監控

碎片率查詢快取記憶體碎片率=qcache_free_blocks / qcache_total_blocks * 100%

命中率查詢快取命中率=(qcache_hits – qcache_inserts) / qcache_hits * 100%

記憶體使用率

查詢快取記憶體使用率=(query_cache_size – qcache_free_memory) / query_cache_size * 100%

qcache_lowmem_prunes

該引數值對於檢測查詢快取區的記憶體大小設定是否,有非常關鍵性的作用,其代表的意義為:查詢快取去因記憶體不足而不得不從查詢快取區刪除的查詢快取資訊,刪除演算法為lru;

query_cache_min_res_unit

記憶體塊分配的最小單元非常重要,設定過大可能增加記憶體碎片的概率發生,太小又可能增加記憶體分配的消耗,為此在系統平穩執行乙個階段性後,可參考公式的計算值:

查詢快取最小記憶體塊 = (query_cache_size – qcache_free_memory) / qcache_queries_in_cache

query_cache_size

我們如何判斷query_cache_size是否設定過小,依然也只有先預設定乙個值,推薦為:32m~128m之間的區域,待系統平穩執行乙個時間段(至少1周),並且觀察這週內的相關狀態值:

(1).qcache_lowmem_prunes;

(2).命中率;

(3).記憶體使用率;

若整個平穩執行期監控獲得的資訊,為命中率高於80%,記憶體使用率超過80%,並且qcache_lowmem_prunes的值不停地增加,而且增加的數值還較大,則說明我們為查詢緩衝區分配的記憶體過小,可以適當地增加查詢快取區的記憶體大小;

若是整個平穩執行期監控獲得的資訊,為命中率低於40%,qcache_lowmem_prunes的值也保持乙個平穩狀態,則說明我們的查詢緩衝區的內 存設定過大,或者說業務場景重複執行一樣查詢語句的概率低,同時若還監測到一定量的freeing items,那麼必須考慮把查詢快取的記憶體條小,甚至關閉查詢快取功能;

業務場景

通過上述的知識梳理和分析,我們至少知道查詢快取的以下幾點:

查詢快取能夠加速已經存在快取的查詢語句的速度,可以不用重新解析和執程式設計客棧行而獲得正確得記錄集;

查詢快取中涉及的表,每乙個表物件都有乙個屬於自己的全域性性質的鎖;

mysql資料快取查詢 Mysql查詢快取

查詢快取 mysql提供了一種快取型別,會快取整個select查詢結果。mysql查詢快取儲存查詢返回的完整結果。當查詢命中該快取,mysql會立即返回結果,跳過了解析 優化和執行階段。以下兩種情況不能被快取 頻繁更新 修改的的表,所有快取資料都會失效,mysql查詢快取會跟蹤查詢中涉及的表,如果這...

mysql 查詢快取

show variables like cache my.cnf設定 mysql慢日誌 mysql有乙個功能就是可以log下來執行的比較慢的sql語句,預設是沒有這個log的,為了開啟這個功能,要修改my.cnf或者在mysql啟動的時候加入一些引數。如果在my.cnf裡面修改,需增加如下幾行 lo...

mysql查詢快取

查詢快取不開啟 r mysql query select username from user where signup date curdate 開啟查詢快取 today date y m d r mysql query select username from user where signup...