亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL的查詢緩存機制基本學習教程

2024-07-24 13:08:29
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL的查詢緩存機制基本學習教程,默認針對InnoDB存儲引擎下來將,需要的朋友可以參考下
 

MySQL緩存機制簡單的說就是緩存sql文本及查詢結果,如果運行相同的sql,服務器直接從緩存中取到結果,而不需要再去解析和執行sql。如果表更改 了,那么使用這個表的所有緩沖查詢將不再有效,查詢緩存值的相關條目被清空。更改指的是表中任何數據或是結構的改變,包括INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改變了的表的使用MERGE表的查詢。顯然,這對于頻繁更新的表,查詢緩存是不適合的,而對于一些不常改變數據且有 大量相同sql查詢的表,查詢緩存會節約很大的性能。

命中條件

緩存存在一個hash表中,通過查詢SQL,查詢數據庫,客戶端協議等作為key.在判斷是否命中前,MySQL不會解析SQL,而是直接使用SQL去查詢緩存,SQL任何字符上的不同,如空格,注釋,都會導致緩存不命中.

如果查詢中有不確定數據,例如CURRENT_DATE()和NOW()函數,那么查詢完畢后則不會被緩存.所以,包含不確定數據的查詢是肯定不會找到可用緩存的

 

工作流程

1. 服務器接收SQL,以SQL和一些其他條件為key查找緩存表(額外性能消耗)

2. 如果找到了緩存,則直接返回緩存(性能提升)

3. 如果沒有找到緩存,則執行SQL查詢,包括原來的SQL解析,優化等.

4. 執行完SQL查詢結果以后,將SQL查詢結果存入緩存表(額外性能消耗)


緩存失效

當某個表正在寫入數據,則這個表的緩存(命中檢查,緩存寫入等)將會處于失效狀態.在Innodb中,如果某個事務修改了表,則這個表的緩存在事務提交前都會處于失效狀態,在這個事務提交前,這個表的相關查詢都無法被緩存.

 

緩存的內存管理

緩存會在內存中開辟一塊內存(query_cache_size)來維護緩存數據,其中有大概40K的空間是用來維護緩存的元數據的,例如空間內存,數據表和查詢結果的映射,SQL和查詢結果的映射等.

MySQL將這個大內存塊分為小的內存塊(query_cache_min_res_unit),每個小塊中存儲自身的類型,大小和查詢結果數據,還有指向前后內存塊的指針.

MySQL需要設置單個小存儲塊的大小,在SQL查詢開始(還未得到結果)時就去申請一塊空間,所以即使你的緩存數據沒有達到這個大小,也需要用這個大小的數據塊去存(這點跟Linux文件系統的Block一樣).如果結果超出這個內存塊的大小,則需要再去申請一個內存塊.當查詢完成發現申請的內存塊有富余,則會將富余的空間釋放掉,這就會造成內存碎片問題,見下圖

MySQL的查詢緩存機制基本學習教程

此處查詢1和查詢2之間的空白部分就是內存碎片,這部分空閑內存是有查詢1查詢完以后釋放的,假設這個空間大小小于MySQL設定的內存塊大小,則無法再被使用,造成碎片問題

在查詢開始時申請分配內存Block需要鎖住整個空閑內存區,所以分配內存塊是非常消耗資源的.注意這里所說的分配內存是在MySQL初始化時就開辟的那塊內存上分配的.

 

緩存的使用時機

衡量打開緩存是否對系統有性能提升是一個很難的話題

1. 通過緩存命中率判斷, 緩存命中率 = 緩存命中次數 (Qcache_hits) / 查詢次數 (Com_select)

2. 通過緩存寫入率, 寫入率 = 緩存寫入次數 (Qcache_inserts) / 查詢次數 (Qcache_inserts)

3. 通過 命中-寫入率 判斷, 比率 = 命中次數 (Qcache_hits) / 寫入次數 (Qcache_inserts), 高性能MySQL中稱之為比較能反映性能提升的指數,一般來說達到3:1則算是查詢緩存有效,而最好能夠達到10:1

 

緩存配置參數

1. query_cache_type: 是否打開緩存

可選項

1) OFF: 關閉

2) ON: 總是打開

3) DEMAND: 只有明確寫了SQL_CACHE的查詢才會吸入緩存

 

2. query_cache_size: 緩存使用的總內存空間大小,單位是字節,這個值必須是1024的整數倍,否則MySQL實際分配可能跟這個數值不同(感覺這個應該跟文件系統的blcok大小有關)

 

3. query_cache_min_res_unit: 分配內存塊時的最小單位大小

 

4. query_cache_limit: MySQL能夠緩存的最大結果,如果超出,則增加 Qcache_not_cached的值,并刪除查詢結果

 

5. query_cache_wlock_invalidate: 如果某個數據表被鎖住,是否仍然從緩存中返回數據,默認是OFF,表示仍然可以返回

 

GLOBAL STAUS 中 關于 緩存的參數解釋:

Qcache_free_blocks: 緩存池中空閑塊的個數

Qcache_free_memory: 緩存中空閑內存量

Qcache_hits: 緩存命中次數

Qcache_inserts: 緩存寫入次數

Qcache_lowmen_prunes: 因內存不足刪除緩存次數

Qcache_not_cached: 查詢未被緩存次數,例如查詢結果超出緩存塊大小,查詢中包含可變函數等

Qcache_queries_in_cache: 當前緩存中緩存的SQL數量

Qcache_total_blocks: 緩存總block數

 

減少碎片策略

1. 選擇合適的block大小

2. 使用 FLUSH QUERY CACHE 命令整理碎片.這個命令在整理緩存期間,會導致其他連接無法使用查詢緩存

PS: 清空緩存的命令式 RESET QUERY CACHE

 

查詢緩存問題分析

MySQL的查詢緩存機制基本學習教程

InnoDB與查詢緩存

Innodb會對每個表設置一個事務計數器,里面存儲當前最大的事務ID.當一個事務提交時,InnoDB會使用MVCC中系統事務ID最大的事務ID跟新當前表的計數器.

只有比這個最大ID大的事務能使用查詢緩存,其他比這個ID小的事務則不能使用查詢緩存.

另外,在InnoDB中,所有有加鎖操作的事務都不使用任何查詢緩存

查詢必須是完全相同的(逐字節相同)才能夠被認為是相同的。另外,同樣的查詢字符串由于其它原因可能認為是不同的。使用不同的數據庫、不同的協議版本或者不同 默認字符集的查詢被認為是不同的查詢并且分別進行緩存。

下面sql查詢緩存認為是不同的:

SELECT * FROM tbl_name Select * from tbl_name

  

查詢緩存相關參數

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       | 599040 | --查詢緩存的大小 | query_cache_type       | ON   | --阻止或是支持查詢緩存 | query_cache_wlock_invalidate | OFF   |  +------------------------------+---------+ 

下面是一個簡單的MySQL查詢緩存機制例子:

[mysql@csdba1850 ~]$ mysql -u root -p 
Enter password:  Welcome to the MySQL monitor. Commands end with ; or /g. Your MySQL connection id is 3 Server version: 5.0.45-community MySQL Community Edition (GPL)  Type 'help;' or '/h' for help. Type '/c' to clear the buffer. 

 

mysql> set global query_cache_size = 600000; --設置緩存內存 
Query OK, 0 rows affected (0.00 sec) 

 

mysql> set session query_cache_type = ON; --開啟查詢緩存 
Query OK, 0 rows affected (0.00 sec) 
 mysql> use test 
Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A  Database changed 
mysql> show tables; 
+----------------+ | Tables_in_test | +----------------+ | animals    |  | person     |  +----------------+ 5 rows in set (0.00 sec)  mysql> select count(*) from animals; +----------+ | count(*) | +----------+ |    6 |  +----------+ 1 row in set (0.00 sec)  --Qcache_hits表示sql查詢在緩存中命中的累計次數,是累加值。 
mysql> SHOW STATUS LIKE 'Qcache_hits'; 
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Qcache_hits  | 0   | --0次 +---------------+-------+ 8 rows in set (0.00 sec)  mysql> select count(*) from animals; +----------+ | count(*) | +----------+ |    6 |  +----------+ 1 row in set (0.00 sec) 

 

mysql> SHOW STATUS LIKE 'Qcache%'; 

 

+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Qcache_hits  | 1   | --表示sql在緩存中直接得到結果,不需要再去解析 +---------------+-------+ 8 rows in set (0.00 sec) 

 

mysql> select count(*) from animals; 
+----------+ | count(*) | +----------+ |    6 |  +----------+ 1 row in set (0.00 sec) 

 

mysql> select count(*) from animals; 
+----------+ | count(*) | +----------+ |    6 |  +----------+ 1 row in set (0.00 sec) 

 

mysql> SHOW STATUS LIKE 'Qcache_hits'; 
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Qcache_hits  | 3   |  --上面的sql也是是從緩存中直接取到結果 +---------------+-------+ 1 row in set (0.00 sec) 
 mysql> insert into animals select 9,'testsds' ; --插入數據后,跟這個表所有相關的sql緩存就會被清空掉 
Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 
 mysql> select count(*) from animals; 
+----------+ | count(*) | +----------+ |    7 |  +----------+ 1 row in set (0.00 sec) 
 mysql> SHOW STATUS LIKE 'Qcache_hits'; 
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Qcache_hits  | 3  | --還是等于3,說明上一條sql是沒有直接從緩存中直接得到的 +---------------+-------+ 1 row in set (0.00 sec) 

 

mysql> select count(*) from animals; 
+----------+ | count(*) | +----------+ |    7 |  +----------+ 1 row in set (0.00 sec) 

 

mysql> SHOW STATUS LIKE 'Qcache_hits';  
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Qcache_hits  | 4   |  +---------------+-------+ 1 row in set (0.00 sec) 


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人亚洲激情| 国产一区二区三区三区在线观看| 国产一区二区色| 欧美亚洲第一页| 国产丝袜精品第一页| 午夜精品久久久久久久99热| 97av在线视频免费播放| 国产成人综合精品在线| 日韩精品中文在线观看| 亚洲精品天天看| 91在线精品播放| 欧美大片在线看| 韩国三级电影久久久久久| 欧美丰满少妇xxxxx| 日韩在线中文字| 国产91色在线免费| 亚洲日本成人女熟在线观看| 亚洲天堂av高清| 亚洲欧美成人精品| 91精品免费久久久久久久久| 国产91露脸中文字幕在线| 亲爱的老师9免费观看全集电视剧| 青青久久av北条麻妃黑人| 欧美精品video| 久久理论片午夜琪琪电影网| 久久久日本电影| 欧美性一区二区三区| 日韩中文字幕精品视频| 91tv亚洲精品香蕉国产一区7ujn| 欧美日韩在线视频观看| 久久久999成人| 亚洲精品一区在线观看香蕉| 欧美色视频日本高清在线观看| 日本久久91av| 国产极品精品在线观看| 国产精欧美一区二区三区| 欧美黑人狂野猛交老妇| 日韩成人在线视频网站| 成人av色在线观看| 国产精品免费观看在线| 高清一区二区三区四区五区| 国产精品视频白浆免费视频| 91久久精品美女高潮| 亚洲最大的成人网| 日日骚久久av| 亚洲无线码在线一区观看| 欧美高清视频一区二区| 日韩免费在线播放| 91九色国产视频| 国产精品www色诱视频| 国产精品免费一区二区三区都可以| 国产精品ⅴa在线观看h| 亚洲精品视频网上网址在线观看| 日韩中文字幕网址| 成人国产精品一区| 日韩精品福利网站| 日韩精品视频免费专区在线播放| 国产日韩欧美视频在线| 欧美一级黑人aaaaaaa做受| 国产成人精品电影久久久| 国产精品aaa| 亚洲人成网站999久久久综合| 欧美精品日韩三级| 欧美另类高清videos| 日韩欧美aⅴ综合网站发布| 国产亚洲精品久久久久久牛牛| 国产精品高清免费在线观看| 国语自产精品视频在线看抢先版图片| 奇米一区二区三区四区久久| 日韩电影免费观看中文字幕| 久久影视电视剧凤归四时歌| 久久这里只有精品视频首页| 69影院欧美专区视频| 国产性色av一区二区| 色樱桃影院亚洲精品影院| 国产一区二区三区在线播放免费观看| 亚洲欧美制服第一页| 午夜精品一区二区三区视频免费看| 国产精品18久久久久久麻辣| 亚洲美女精品久久| 在线播放日韩精品| 欧美精品aaa| 亚洲深夜福利视频| 欧美性猛交视频| 色无极影院亚洲| 欧美性xxxxxxxxx| 国产v综合ⅴ日韩v欧美大片| 综合网中文字幕| 国产精品一区二区性色av| 狠狠爱在线视频一区| 日本久久久久久久| 国产亚洲在线播放| 国产午夜精品全部视频播放| 国产精品xxxxx| 亚洲女成人图区| 精品久久久91| 亚洲国产精品一区二区久| 日韩一区二区av| 久久亚洲精品国产亚洲老地址| 国产精品欧美亚洲777777| 川上优av一区二区线观看| 亚洲欧美制服丝袜| 国产精品网站入口| 国产精品久久久久久一区二区| 精品国产乱码久久久久久虫虫漫画| 国产综合久久久久| 日韩中文字幕第一页| 日韩成人在线视频网站| 欧美日韩999| 国产精品美女呻吟| 国产精品96久久久久久又黄又硬| 国产99在线|中文| 亚洲精品v天堂中文字幕| 国产精品久久久久久久久久久久久| 国产视频精品在线| 欧美激情a在线| 国产日韩亚洲欧美| 2024亚洲男人天堂| 国产精品欧美一区二区三区奶水| 日韩av手机在线看| 久久人体大胆视频| 国产剧情久久久久久| 亚洲欧美一区二区激情| 国产一区二区三区视频| 久久躁日日躁aaaaxxxx| 91精品在线影院| 亚洲第一精品福利| 国产精品流白浆视频| 一区二区成人精品| 欧美成人在线影院| 日韩高清电影免费观看完整| 国产性色av一区二区| 亚洲国产精品99久久| 亚洲日本欧美日韩高观看| 日韩在线观看你懂的| 欧美国产高跟鞋裸体秀xxxhd| 日韩精品有码在线观看| 91伊人影院在线播放| 在线视频亚洲欧美| 欧美性xxxx极品hd满灌| 亚洲www永久成人夜色| 精品亚洲男同gayvideo网站| 午夜剧场成人观在线视频免费观看| 成人免费淫片aa视频免费| 亚洲免费福利视频| 久久久精品999| 国产欧洲精品视频| 久久久久久久国产精品| 亚洲天堂男人天堂女人天堂| 国产精品自产拍在线观| 最近2019中文免费高清视频观看www99| 91伊人影院在线播放| 97超碰国产精品女人人人爽| 一区二区亚洲欧洲国产日韩| 日韩欧美成人精品| 欧美在线欧美在线| 日韩欧美视频一区二区三区| 国产成人精品在线播放| 亚洲男人天堂古典| 亚洲电影免费观看高清完整版在线观看| 国产精品69av| 欧美高清videos高潮hd| 欧美性猛交xxxx富婆弯腰| 日韩亚洲综合在线|