日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL的Query Cache圖文詳解

瀏覽:175日期:2023-10-01 12:24:14
目錄一、原理概述二、Query Cache系統變量1. have_query_cache2. query_cache_limit3. query_cache_min_res_unit4. query_cache_size5. query_cache_type6. query_cache_wlock_invalidate三、Query Cache狀態變量1. Qcache_free_blocks2. Qcache_free_memory3. Qcache_hits4. Qcache_inserts5. Qcache_lowmem_prunes6. Qcache_not_cached7. Qcache_queries_in_cache8. Qcache_total_blocks四、優點與缺點1. 優點2. 缺點五、常見問答1. 應當在什么條件下使用Query Cache?2. Query Cache與查詢語句有什么關系?3. 客戶端提交的查詢語句的大小寫對Query Cache有影響嗎?4. 一個查詢語句在Query Cache中緩存的查詢結果,在什么情況下會失效?5. Query Cache碎片率是什么?有什么用?6. Query Cache利用率是什么?有什么用?7. Query Cache命中率是什么?有什么用?8. 如何判斷Query Cache是空閑內存不足,還是內存碎片太多?9. 系統變量query_cache_min_res_unit應當設置為多大?Mysql查詢緩存Query_cache的功用一、原理概述

Query Cache就是把“查詢返回的結果”緩存起來。但是,僅僅只是緩存“查詢返回的結果”,其實是不準確的,Query Cache還會緩存查詢語句,在內存中將“查詢語句”和“查詢返回的結果”映射起來。當MySQL接收到一條SELECT類型的查詢語句時,MySQL會對這條查詢語句進行hash計算而得到一個hash值。然后,通過該hash值到Query Cache中去匹配。如果沒有得到匹配結果,則會將這個hash值存放在一個hash鏈表中,同時將此次查詢的結果存放至緩存中。存放hash值的鏈表的每個節點都會存放相應查詢返回結果在緩存中的地址,以及該次查詢所涉及到的一些表的相關信息。如果通過hash值匹配到相同的查詢,則會直接將緩存中相應的查詢結果返回給客戶端。如果MySQL的任何一張表中的任何一條數據發生了變化,便會通知Query Cache,將和這張表相關的查詢緩存全部失效,并釋放占用的內存空間。修改表數據的操作包括:INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE和DROP DATABASE等等。

Query Cache的工作原則是:執行查詢最快的方式就是不去執行。Query Cache的組件圖和流程圖如下所示:

MySQL的Query Cache圖文詳解

MySQL的Query Cache圖文詳解

二、Query Cache系統變量

Query Cache的主要可配置系統變量如下所示:

MySQL的Query Cache圖文詳解

1. have_query_cache

表示mysqld是否支持Query Cache。

2. query_cache_limit

表示Query Cache可以緩存的單條查詢的最大結果集的大小,默認值為1MB。如果某次查詢的結果集大小超過這個系統變量的值,那么Query Cache就不會緩存這次查詢的結果集。

3. query_cache_min_res_unit

表示MySQL為Query Cache每次分配內存的最小空間大小,也就是用于緩存查詢結果的最小內存空間的大小,默認值為4KB。

4. query_cache_size

表示Query Cache可以使用的最大內存空間的大小,默認值為1MB。設置的值必須是1024的整數倍,若不是整數倍,MySQL則會自動調整降低至達到1024倍數的最大值。

5. query_cache_type

表示Query Cache的工作模式,同時也是Query Cache功能的開關,可以設置為0(OFF)、1(ON)和2(DEMAND)三種值:

0(OFF):關閉Query Cache功能,任何情況下都不會使用Query Cache。

1(ON):開啟Query Cache功能,但是當SELECT語句中使用了SQL_NO_CACHE選項之后,將不會使用Query Cache。

2(DEMAND):開啟Query Cache功能,但是只有當SELECT語句中使用了SQL_CACHE選項之后,才會使用Query Cache。

6. query_cache_wlock_invalidate

控制當有寫鎖加在表上的時候,是否先讓該表相關的Query Cahce失效,具有1(ON)和0(OFF)兩種取值:

1(ON):在寫鎖定的同時將使該表相關的所有Query Cache失效。

0(OFF):在寫鎖定的同時仍然允許讀取該表相關的Query Cache。

以上環境變量經常需要調整的是query_cache_limit和query_cache_min_res_unit,它們都需要根據實際業務進行相應的調整。例如,如果緩存的查詢結果集大多數都小于4KB的話,則可以適當的調整query_cache_min_res_unit的值,以避免造成內存的浪費。如果查詢結果集的大小又都大于1MB時,就需要調整query_cache_limit的值,避免因為結果集大小超過限制而不被緩存。

三、Query Cache狀態變量

MySQL提供一系列的狀態變量來記錄Query Cache的當前狀態,使你能夠確認Query Cache的運行是否健康、命中率如何、內存空間大小是否足夠,等等。Query Cache的狀態變量如下所示:

MySQL的Query Cache圖文詳解

1. Qcache_free_blocks

表示Query Cache中目前還有多少空閑的內存塊。如果該值比較大,則說明Query Cache中的內存碎片可能比較多。FLUSH QUERY CACHE會對緩存中的碎片進行整理,從而得到一個較大的空閑內存塊。

2. Qcache_free_memory

表示Query Cache目前空閑的內存大小。

3. Qcache_hits

表示有多少次查詢在Query Cache命中。

4. Qcache_inserts

向Query Cache中插入新記錄的次數,也就是查詢沒有命中的次數。

5. Qcache_lowmem_prunes

表示由于Query Cache的內存不足而從緩存中刪除的查詢結果的數量。如果這個數值在不斷增長,那么一般是Query Cache的空閑內存不足(通過Qcache_free_memory判斷),或者內存碎片較嚴重(通過Qcache_free_blocks判斷)。

6. Qcache_not_cached

表示沒有被緩存的查詢數量。有三種情況會導致查詢結果不會被緩存:其一,由于query_cache_type的設置;其二,查詢不是SELECT語句;其三,使用了now()之類的函數,導致查詢語句一直在變化。

7. Qcache_queries_in_cache

表示Query Cache中當前包含的查詢結果數量。

8. Qcache_total_blocks

表示Query Cache中的內存塊總數量。

四、優點與缺點1. 優點

Query Cache的查詢,發生在MySQL接收到客戶端的查詢請求、查詢權限驗證之后和查詢SQL解析之前。也就是說,當MySQL接收到客戶端的查詢SQL之后,僅僅只需要對其進行相應的權限驗證之后,就會通過Query Cache來查找結果,甚至都不需要經過Optimizer模塊進行執行計劃的分析優化,更不需要發生任何存儲引擎的交互。由于Query Cache是基于內存的,直接從內存中返回相應的查詢結果,因此減少了大量的磁盤I/O和CPU計算,導致效率非常高。

2. 缺點

即使Query Cache的優點很明顯,但是也不能忽略它所帶來的一些缺點:

查詢語句的hash計算和hash查找帶來的資源消耗。如果將query_cache_type設置為1(也就是ON),那么MySQL會對每條接收到的SELECT類型的查詢進行hash計算,然后查找這個查詢的緩存結果是否存在。雖然hash計算和查找的效率已經足夠高了,一條查詢語句所帶來的開銷可以忽略,但一旦涉及到高并發,有成千上萬條查詢語句時,hash計算和查找所帶來的開銷就必須重視了。

Query Cache的失效問題。如果表的變更比較頻繁,則會造成Query Cache的失效率非常高。表的變更不僅僅指表中的數據發生變化,還包括表結構或者索引的任何變化。

查詢語句不同,但查詢結果相同的查詢都會被緩存,這樣便會造成內存資源的過度消耗。查詢語句的字符大小寫、空格或者注釋的不同,Query Cache都會認為是不同的查詢(因為他們的hash值會不同)。

相關系統變量設置不合理會造成大量的內存碎片,這樣便會導致Query Cache頻繁清理內存。

五、常見問答1. 應當在什么條件下使用Query Cache?

實際上,并不是所有表都適合使用Query Cache。造成Query Cache失效的原因主要是相應的表發生了變更,那么就應該避免在變更頻繁的表上使用Query Cache。MySQL針對Query Cache有兩個專用的SQL選項:SQL_NO_CACHE和SQL_CACHE。若將query_cache_type設置為1(ON),那么通過SQL_NO_CACHE選項便能強制不使用Query Cache;若將query_cache_type設置為2(DEMAND),那么通過SQL_CACHE選項便能強制使用Query Cache。通過強制不使用Query Cache,可以讓MySQL在頻繁變更的表上不使用Query Cache,這樣減少了內存開銷,也減少了hash計算和查找的開銷。

2. Query Cache與查詢語句有什么關系?

無論MySQL收到的查詢語句是單表還是多表或是包含子查詢的SQL,都被作為一個查詢,不會被分拆成多個查詢來進行緩存,包括Union語句。

3. 客戶端提交的查詢語句的大小寫對Query Cache有影響嗎?

有影響。由于Query Cache在內存中是以hash結構來進行映射的,hash算法的基礎就是組成查詢語句的字符,所以必須要整個查詢語句在字符級別完全一致,才能在Query Cache中命中。

4. 一個查詢語句在Query Cache中緩存的查詢結果,在什么情況下會失效?

為了保證Query Cache中的內容與是實際數據絕對一致,當表中的數據有任何變化,包括新增、修改、刪除等,都會使所有引用到該表的Query Cache緩存數據失效。

5. Query Cache碎片率是什么?有什么用?

Query Cache碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%如果Query Cache碎片率超過20%,則可以用FLUSH QUERY CACHE整理內存碎片;如果你的查詢都是小數據量的話,可以嘗試減小query_cache_min_res_unit。

6. Query Cache利用率是什么?有什么用?

Query Cache利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%

Query Cache利用率在25%以下的話,說明query_cache_size設置的過大,可適當減小;Query Cache利用率在80%以上,而且Qcache_lowmem_prunes > 50的話,說明query_cache_size可能有點小,或者就是內存碎片太多。

7. Query Cache命中率是什么?有什么用?

① 可緩存查詢的Query Cache命中率 = Qcache_hits / (Qcache_hits + Qcache_inserts) * 100%② 涵蓋所有查詢的Query Cache命中率 = Qcache_hits / (Qcache_hits + Com_select) * 100%

若命中率在50-70%的范圍之內,則表明Query Cache的緩存效率較高。如果命中率明顯小于50%,那么建議禁用(將query_cache_type設置為0(OFF))或按需使用(將query_cache_type設置為2(DEMAND))Query Cache,節省的內存可以用作InnoDB的緩沖池。

8. 如何判斷Query Cache是空閑內存不足,還是內存碎片太多?

如果Qcache_lowmem_prunes值比較大,表示Query Cache的內存空間大小設置太小,需要增大。

如果Qcache_free_blocks值比較大,表示內存碎片較多,需要使用FLUSH QUERY CACHE語句清理內存碎片。

9. 系統變量query_cache_min_res_unit應當設置為多大?

query_cache_min_res_unit的計算公式如下所示:

query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache

其中,一般不建議將Query Cache的大小(也就是query_cache_size系統變量)設置超過256MB。

Mysql查詢緩存Query_cache的功用

MySQL的查詢緩存并非緩存執行計劃,而是查詢及其結果集,這就意味著只有相同的查詢操作才能命中緩存,因此MySQL的查詢緩存命中率很低,另一方面,對于大結果集的查詢,其查詢結果可以從cache中直接讀取,有效的提升了查詢效率。

那么如何設置緩存的大小呢?來看一下:

1、在mysql客戶端命令行中我們可以這么查看緩存是否開啟以及緩存設置的大小:

mysql> show variables like ’%query_cache%’;+------------------------------+-------------+| Variable_name| Value |+------------------------------+-------------+| have_query_cache | YES || query_cache_limit | 1048576 || query_cache_min_res_unit | 4096|| query_cache_size | 16106127360 || query_cache_type | ON || query_cache_wlock_invalidate | OFF |+------------------------------+-------------+6 rows in set (0.01 sec)

其中:

query_cache_type: 是否開啟緩存功能,取值為ON, OFF, DEMAND,默認值為ON- 值為OFF或0時,查詢緩存功能關閉;- 值為ON或1時,查詢緩存功能打開,SELECT的結果符合緩存條件即會緩存,否則,不予緩存,顯式指定SQL_NO_CACHE,不予緩存;- 值為DEMAND或2時,查詢緩存功能按需進行,顯式指定SQL_CACHE的SELECT語句才會緩存;其它均不予緩存

query_cache_wlock_invalidate:表示當有其他客戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中,是否返回cache結果還是等寫操作完成再讀表獲取結果。

query_cache_limit 指定單個查詢能夠使用的緩沖區大小,缺省為1M;

query_cache_min_res_unit為系統分配的最小緩存塊大小,默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據查詢,就容易造成內存碎片和浪費;query_cache_size:表示緩存的大小。

了解了以上的指標后我們就可以在mysql的配置文件my.cnf中進行設置。然后重啟mysl服務器即可。在[mysqld]下面添加參數。一般是設置query_cache_size和query_cache_type兩項。

2、上面查看的是我們進行緩存的配置,它一般從配置文件中讀取值,但是有時候我們需要實時查看當前mysql中的數據緩存大小。

mysql> show status like ’%qcache%’;+-------------------------+----------+| Variable_name | Value |+-------------------------+----------+| Qcache_free_blocks | 1|| Qcache_free_memory | 1031832 || Qcache_hits | 0|| Qcache_inserts | 0|| Qcache_lowmem_prunes | 0|| Qcache_not_cached | 16489053 || Qcache_queries_in_cache | 0|| Qcache_total_blocks | 1|+-------------------------+----------+8 rows in set (0.00 sec)

解釋:

MySQL的Query Cache圖文詳解

Qcache_free_memory:緩存中的空閑內存。

Qcache_total_blocks:緩存中塊的數量。

Qcache_lowmem_prunes:緩存出現內存不足并且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個 數字在不斷增長,就表示可能碎片非常嚴重,或者內存很少。如何確定就需要查看Qcache_free_blocks和Qcache_free_memory 兩項指標。

3、清空緩存:

flush query cache命令

加大緩存有助于我們查詢的效率提高:

這里舉個例子:

mysql> use mob_adnDatabase changedmysql> select count(*) from creative_output;+----------+| count(*) |+----------+| 87151154 |+----------+1 row in set (3 min 18.29 sec)mysql> select count(*) from creative_output;+----------+| count(*) |+----------+| 87151154 |+----------+1 row in set (0.00 sec)mysql> select count(*) from creative_output;+----------+| count(*) |+----------+| 87151154 |+----------+1 row in set (0.00 sec)

可以看到緩存真的很厲害。

還有的同學會想到innodb_buffer_pool這個參數,兩者的作用與區別我會接著來講。

順便這里在講解一下SQL幾項優化(很好):

https://www.cnblogs.com/L-dongf/p/9163848.html

到此這篇關于MySQL的Query Cache圖文詳解的文章就介紹到這了,更多相關MySQL Query Cache內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品电影一区亚洲| 视频在线观看国产精品| 一区二区三区四区日韩| 99国产精品久久久久久久成人热| 精品在线播放| 亚洲欧美日韩国产一区二区| 在线观看视频免费一区二区三区| 国产精品成人国产| 色欧美自拍视频| 国产精品超碰| 日韩欧美在线中字| 99视频+国产日韩欧美| 中文字幕中文字幕精品| 日本在线成人| 国产精品三p一区二区| 国产一区二区色噜噜| 日韩精品网站| 久热re这里精品视频在线6| 日韩精品三级| 高清不卡一区| 午夜宅男久久久| 国产精品hd| 亚洲高清毛片| 欧美日一区二区三区在线观看国产免| 国产精品久久久久久久久久妞妞 | 肉色欧美久久久久久久免费看| 欧美天堂视频| 国产精品xxx在线观看| 日本欧美不卡| 亚洲免费成人av在线| 另类欧美日韩国产在线| 久久国产电影| 欧美日中文字幕| 欧美日韩中出| 99久久精品费精品国产| 日韩激情视频网站| 国产精品久久久久久久久久10秀| 亚洲一区免费| 国产精品1区| 91久久久久| 九九久久国产| 色狠狠一区二区三区| 福利在线免费视频| 国产麻豆综合| 精品国产一级| 麻豆亚洲精品| 国产aa精品| 五月激激激综合网色播| 日韩精品影视| 91九色综合| 欧美日韩国产精品一区二区亚洲| 国产精品久久久久77777丨| 国产免费成人| 精品视频在线观看网站| 日韩精品导航| re久久精品视频| 91日韩欧美| 国产精品亚洲四区在线观看| 伊人久久亚洲影院| 在线看片国产福利你懂的| 亚洲精品韩国| 91精品国产调教在线观看| 欧美日韩va| 99视频一区| av免费不卡国产观看| 久久国内精品自在自线400部| 欧美/亚洲一区| 欧美日韩在线观看首页| 亚洲色图网站| 免费成人网www| 精品国产黄a∨片高清在线| 91亚洲精品在看在线观看高清| 欧美日韩日本国产亚洲在线| 伊人久久视频| 麻豆精品蜜桃视频网站| 日韩av中文字幕一区二区三区| 日韩天堂av| 亚洲一级网站| 久久九九精品| 日韩久久一区二区三区| 精品欧美久久| 亚洲成a人片| 久久精品国产999大香线蕉| 日韩av三区| 久久电影一区| 亚洲国产不卡| 免费欧美一区| 视频福利一区| 国产中文在线播放| 色婷婷综合网| 97精品视频在线看| 丰满少妇一区| 国产精品久久久久久久久妇女| 欧美aa在线视频| 欧美激情视频一区二区三区免费| 亚洲综合专区| 婷婷精品在线| 日韩一区二区三区高清在线观看| 久久蜜桃av| 欧美va天堂在线| 激情综合网址| 午夜久久tv| 人人爽香蕉精品| 亚洲一区二区免费在线观看| 热久久久久久久| 亚洲免费影院| 亚洲一区二区小说| 日韩精品导航| 久久亚洲人体| 久久国产欧美| 国产婷婷精品| 日本va欧美va欧美va精品| 国产探花一区二区| 青青国产精品| 综合日韩av| 蜜桃成人av| 热久久国产精品| 国产毛片久久久| 日韩一区二区中文| 国产精品毛片一区二区三区| 日本一区二区三区中文字幕| 麻豆久久久久久| 亚洲成a人片| 久久福利毛片| 国产欧美日韩一区二区三区四区| 免费日韩一区二区三区| 欧美国产美女| 伊人久久成人| 日韩精品午夜视频| 国产一区二区三区91| 欧美午夜不卡| 国产精品九九| 99视频精品免费观看| 久久精品99国产精品| 激情不卡一区二区三区视频在线| 99久久亚洲精品| 亚洲乱码视频| 精品国产亚洲日本| 午夜日韩av| 国产伦理久久久久久妇女| 中文字幕在线官网| 在线观看亚洲精品福利片| 国产一区三区在线播放| 999久久久精品国产| 日韩综合小视频| 日韩在线短视频| 日韩高清一区| 日韩免费av| 欧美日韩a区| 美女网站一区| 国内自拍视频一区二区三区| 另类亚洲自拍| 日韩一区三区| 国产一卡不卡| 日韩视频一区| 成人一二三区| 日韩欧美高清一区二区三区| 日本高清不卡一区二区三区视频| 久久av一区| av资源中文在线天堂| 亚洲无线观看| 欧美一级精品| 国产一区二区三区四区五区传媒| 日韩影院精彩在线| 久久免费黄色| 久久精品国产久精国产| 亚洲精品一区二区在线播放∴| 三级精品视频| 欧美aa在线视频| 日本中文字幕视频一区| 天堂资源在线亚洲| 精品国产亚洲日本| 国产欧美88| 欧美精品羞羞答答| 福利欧美精品在线| 国产女人18毛片水真多18精品| 亚洲制服少妇| 在线视频观看日韩| www.九色在线| 美女视频一区在线观看| 91亚洲无吗| 亚洲不卡视频| 视频在线观看一区二区三区| 亚洲国产不卡| 久久视频国产| 日韩激情一区| 国产传媒在线| 国产aa精品| 久久不卡日韩美女| 欧美日韩一区二区三区在线电影| 快she精品国产999| 欧美日韩三区| 91成人精品视频| 亚洲二区精品| 亚洲婷婷免费| 久久视频一区| 99久久夜色精品国产亚洲狼 | 午夜久久一区| 精品一区在线| 亚洲国产成人精品女人|