更新時間:2021-01-20 17:02:54 來源:動力節點 瀏覽1077次
眾所周知,緩存的設置是所有現代計算機系統發揮高性能的重要因素之一。對于MySQL數據庫來說,也是得益于MySQL緩存機制,才能夠提高MySQL數據庫的性能,減少數據的內存占比。
MySQL緩存機制簡單的說就是緩存SQL文本及查詢結果,如果運行相同的SQL,服務器直接從緩存中取到結果,而不需要再去解析和執行SQL。如果表更改了,那么使用這個表的所有緩存查詢將不再有效,查詢緩存中值相關條目被清空。這里的更改指的是表中任何數據或是結構發生改變,包括INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改變了的表使用MERGE表的查詢。顯然,這對于頻繁更新的表,查詢緩存是不適合的,而對于一些不常改變數據且有大量相同SQL查詢的表,查詢緩存會節約很大的性能。
一、MySQL緩存規則
1.開啟了緩存,MySQL Server會自動將查詢語句和結果集返回到內存,下次再查直接從內存中取;
2.緩存的結果是通過sessions共享的,所以一個client查詢的緩存結果,另一個client也可以使用。
3.MySQL Query Cache內容為 select 的結果集, cache 使用完整的SQL字符串做 key, 并區分大小寫,空格等。即兩個SQL必須完全一致才會導致cache命中。即檢查查詢緩存時,MySQL Server不會對SQL做任何處理,它精確的使用客戶端傳來的查詢,只要字符大小寫或注釋有點不同,查詢緩存就認為是不同的查詢;
4.prepared statement永遠不會cache到結果,即使參數完全一樣。在 5.1 之后會得到改善。
5.where條件中如包含任何一個不確定的函數將永遠不會被cache, 比如current_date, now等。
6.date 之類的函數如果返回是以小時或天級別的,最好先算出來再傳進去。
select * from foo where date1=current_date -- 不會被 cache
select * from foo where date1='2008-12-30' -- 被cache, 正確的做法
7.太大的result set不會被cache (< query_cache_limit)
8.MySQL緩存在分庫分表環境下是不起作用的
9.執行SQL里有觸發器,自定義函數時,MySQL緩存也是不起作用的
二、緩存失效
在表的結構或數據發生改變時,查詢緩存中的數據不再有效。如INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會導致緩存數據失效。所以查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。
一旦表數據進行任何一行的修改,基于該表相關cache立即全部失效。
手動清理緩存可以使用下面三個SQL
1.FLUSH QUERY CACHE; #清理查詢緩存內存碎片
2.RESET QUERY CACHE;#從查詢緩存中移除所有查詢
3.FLUSH TABLES; #關閉所有打開的表,同時該操作會清空查詢緩存中的內容
四、緩存機制中的內存管理
MySQL Query Cache 使用內存池技術,自己管理內存釋放和分配,而不是通過操作系統。內存池使用的基本單位是變長的block, 用來存儲類型、大小、數據等信息;一個result set的cache通過鏈表把這些block串起來。block最短長度為query_cache_min_res_unit。
當服務器啟動的時候,會初始化緩存需要的內存,是一個完整的空閑塊。當查詢結果需要緩存的時候,先從空閑塊中申請一個數據塊為參數query_cache_min_res_unit配置的空間,即使緩存數據很小,申請數據塊也是這個,因為查詢開始返回結果的時候就分配空間,此時無法預知結果多大。
分配內存塊需要先鎖住空間塊,所以操作很慢,MySQL會盡量避免這個操作,選擇盡可能小的內存塊,如果不夠,繼續申請,如果存儲完時有空余則釋放多余的。
但是如果并發的操作,余下的需要回收的空間很小,小于query_cache_min_res_unit,不能再次被使用,就會產生碎片。
MySQL緩存機制從某種程度上來說,和其他的系統緩存有類似的作用:提高系統的性能,釋放系統的內存空間。但MySQL緩存機制又有著其獨特的特性,對于數據重復性比較高的查詢有著顯著的作用。想要學習更多的MySQL知識,敬請期待本站的MySQL教程,名師講解,各種知識點一目了然。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習