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

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

MySQL Innodb關鍵特性之插入緩沖(insert buffer)

瀏覽:739日期:2023-10-04 07:03:27
什么是insert buffer?

插入緩沖,也稱之為insert buffer,它是innodb存儲引擎的關鍵特性之一,我們經常會理解插入緩沖時緩沖池的一個部分,這樣的理解是片面的,insert buffer的信息一部分在內存中,另外一部分像數據頁一樣,存在于物理頁中。

在innodb中,我們知道,如果一個表有自增主鍵,那么對于這個表的默認插入是非常快的,注意,這里的主鍵是自增的,如果不是自增的,那么這個插入將會變成隨機的,就可能帶來數據頁分裂的開銷,這樣,插入就不是順序的,就會變慢。還有一種情況,就是如果我們插入的id不是順序的,而是隨機的,那么即使有自增主鍵,那么插入的速度也不會特別快。

如果我們定義了一個表,包含一個主鍵和一個非聚集索引,如下:

create table t(a int auto_increment,b varchar(30),primary key(a),key (b));

當我們按照主鍵a進行插入的時候,對于非聚集索引,也就是常說的二級索引b,它的插入不是順序的,插入性能必然會下降。

Innodb存儲引擎針對這種情況,設計了Insert Buffer,對于非聚集索引的插入或者更新操作,不是每一次插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩沖池中,如果在,則直接插入,如果不在,則先放入一個insert buffer中,告訴數據庫這個非聚集的索引已經插入到了葉子節點,實際上并沒有插入,只是存放在另外一個位置,然后再以一定的頻率和情況進行Insert buffer和輔助索引葉子節點合并操作。這種時候,經常能將多條記錄的插入合并到一個操作中,這樣就大大提高了非聚集索引離散插入的性能。

insert buffer的觸發條件?

insert buffer需要滿足兩個條件才能被使用,第一,索引是輔助索引,也就是二級索引,第二,索引不是唯一的。當滿足上述兩個條件的時候,就可以使用insert buffer,從而提高數據庫的插入操作性能。

這里需要注意,如果在程序進行了大量操作的時候發生了MySQL數據庫的宕機,那么肯定有大量的insert buffer沒有合并到實際的非聚集索引中去,恢復可能會造成很長的時間。

為什么不能是唯一索引?

之所以不支持唯一索引,是因為如果輔助索引是唯一索引,那么在插入時需要校驗唯一性,校驗唯一性的時候就會發生離散讀取,從而又增加了開銷,那么insert buffer得不償失。

我們可以通過show engine innodb status來查看insert buffer的使用情況,如下:

mysql--root@localhost:dms_alimetadata 20:35:24>>show engine innodb statusG-------------------------------------INSERT BUFFER AND ADAPTIVE HASH INDEX-------------------------------------Ibuf: size 1, free list len 0, seg size 2, 0 mergesmerged operations: insert 0, delete mark 0, delete 0discarded operations: insert 0, delete mark 0, delete 0

其中size代表了已經合并記錄頁的數量,free list len代表了空閑列表的長度,seg size顯示了當前insert buffer的大小為2*16KB

引入Change Buffer的概念

最新的MySQL5.7已經支持change buffer,事實上,它在innodb 1.0.x版本已經引入,這個change buffer 可以理解為insert buffer的升級,也就是對常見的DML語言都可以進行緩沖,包含insert delete以及update,對應的分別是insert buffer,delete buffer以及purge buffer。

當然,change buffer的使用對象仍然是非唯一的輔助索引。

這里我們以update操作為例,update的過程可以拆分為兩個部分:

第一個部分是將記錄的delete_mask標記為刪除,如果你不了解delete_mask,可以在4月9號的文章中去看。第二個部分是真正的將記錄刪除。

而delete buffer對應的是update的第一個過程,purge buffer對應的是第二個部分。

在innodb中,我們可以通過參數innodb_change_buffering來開啟buffer的各種選項,該參數可選的值為inserts,deletes,purges,changes,all,none等,其中inserts,deletes和purges就是前面討論過的情況,changes表示開啟inserts和deletes,all表示開啟所有,默認的參數如下:

mysql--root@localhost:dms_alimetadata 21:13:37>>show variables like ’%buffering%’;+-------------------------+-------+| Variable_name | Value |+-------------------------+-------+| innodb_change_buffering | all |+-------------------------+-------+1 row in set (0.01 sec)

我們還可以通過innodb_change_buffer_max_size來控制change_buffer的最大使用內存數量,該參數的默認值是25,也就是1/4,示例如下:

mysql--root@localhost:dms_alimetadata 21:20:52>>show variables like ’%innodb_change_buffer_max_size%’;+-------------------------------+-------+| Variable_name | Value |+-------------------------------+-------+| innodb_change_buffer_max_size | 25 |+-------------------------------+-------+1 row in set (0.00 sec)

在上面的show engine innodb status命令的輸出結果中,顯示了merged operation和discarded operation,其中insert 表示insert buffer的操作次數,delete mark表示delete buffer的操作次數,而delete表示purge buffer的操作次數,discarded operation表示當change buffer發生merge時,表已經被刪除,此時就無需進行合并。

Insert Buffer的實現?

insert buffer的數據結構是一棵B+樹,類似聚集索引一樣,全局只有一棵insert buffer B+樹,它負責對所有的表進行insert buffer,而這棵B+樹放在共享表空間中,也就是ibdata1文件中,因此,試圖通過ibd文件恢復表數據的時候可能會出現check table失敗,原因是表的輔助索引中的數據可能還在insert buffer中,所以通過ibd文件恢復文件之后,還需要進行repair table操作來重建表上的輔助索引。

insert buffer既然是一棵樹,那么必定有葉子節點和非葉子節點,非葉子節點存放的是查詢的search key值,它的構造如下:

+---------+------------+-------+| space | marker | Value |+---------+------------+-------+

這個結構一共占用9個字節,其中,space表示待插入的記錄所在的表的表空間id,這個id是每個表都要有的唯一的id,其中space占用4個字節,marker占用1個字節,用來兼容老版本的insert buffer,offset占用4個字節,表示頁所在的偏移量。

輔助索引的插入過程?

當一個輔助索引要插入到數據頁的時候,如果這個數據頁不在緩沖池中,那么innodb會根據規則構造一個search key,接下來將這個記錄插入到insert buffer的B+樹里面去,插入的過程中,需要對這個記錄進行一些構造,最終插入的結果是類似下面這樣的一條記錄:

+---------+------------+-------+------------+------+-------+------+-------+| space | marker | Value | metadata | | | | |+---------+------------+-------+------------+------+-------+------+-------+

可以發現,最后面多了一個metadata的字段和4個其他的字段,先來說說metadata的字段,它占用4個字節,它用來排序每個記錄進入insert buffer的順序,從第5列開始,就是實際插入記錄的各個字段的值了,因此和單純的數據記錄相比,insert buffer需要額外13個字節的開銷。

為了保證每次merge insert buffer成功,需要設置一個特殊的數據頁來標記每個輔助索引頁的可用空間,這個數據頁的類型為insert buffer bitmap,這個頁可以追蹤很多輔助索引頁的可用空間。這里簡單了解一下,下面會解釋它的用法。

Merged Insert Buffer的時機?

我們前面已經知道,當插入記錄的輔助索引頁不在緩沖池中的時候,需要將輔助索引記錄插入到這棵B+樹中,后續會從insert buffer中往真正的輔助索引中進行合并,那么什么時候進行合并呢?

1、輔助索引頁被讀取到緩沖池的時候

2、insert buffer Bitmap追蹤到該輔助索引頁已經沒有足夠的可用空間時,一般的閾值是輔助索引頁空間的1/32

3、master thread每秒執行一次merge insert buffer的操作

以上就是MySQL Innodb關鍵特性之插入緩沖(insert buffer)的詳細內容,更多關于Innodb特性之插入緩沖的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美国产极品| 欧美日韩精品免费观看视欧美高清免费大片| 国产亚洲第一伦理第一区| 91精品高清| 在线日韩一区| 日本欧美不卡| 秋霞影视一区二区三区| а√天堂中文在线资源8| 丝袜美腿高跟呻吟高潮一区| 亚洲成人精品| 精品女同一区二区三区在线观看| 亚洲毛片在线免费| 欧美日韩中文| 久久一区亚洲| 日本不卡免费高清视频在线| 中国字幕a在线看韩国电影| 黄色精品视频| 伊人久久在线| 1024精品久久久久久久久| 日韩影院精彩在线| 欧美日韩精品一区二区三区视频| 日日夜夜免费精品视频| 日韩区欧美区| 国产日韩一区| 成人在线视频中文字幕| 精品一区二区男人吃奶| 久久婷婷亚洲| 99视频一区| 日韩激情综合| 91视频久久| 视频在线观看国产精品| 美女在线视频一区| 久久蜜桃资源一区二区老牛| 久久精品 人人爱| 国产综合亚洲精品一区二| 国产精品视频一区二区三区四蜜臂 | 日韩av网站在线观看| 视频在线在亚洲| 久久在线视频免费观看| 激情欧美日韩一区| 日韩av中文字幕一区二区| 国产精品网址| 91精品一区二区三区综合| 9色国产精品| 一区二区三区四区在线观看国产日韩| 综合欧美亚洲| 中文字幕色婷婷在线视频| 亚洲精品小说| 国产欧美一区二区三区米奇| 中文字幕人成乱码在线观看| 日韩中文字幕av电影| 国产精品嫩模av在线| 日韩欧美不卡| 国产欧美日韩精品高清二区综合区| 日韩精品中文字幕第1页| 亚洲中字黄色| 国产精品一区二区精品| 国产欧美88| 亚洲福利国产| 欧美日韩调教| 欧美日韩精品一本二本三本| 美女久久精品| 天堂va在线高清一区| 久久三级福利| 久久女人天堂| 欧美片第1页综合| 日韩视频一区| 久久久久久免费视频| 国产激情一区| 国产探花一区二区| 在线观看一区| 丝袜亚洲另类欧美| 国产精品色网| 女同性一区二区三区人了人一| 91九色综合| 欧美精品资源| 精品国产精品国产偷麻豆| 亚洲ww精品| 蜜桃av一区二区在线观看| 91精品二区| 欧美.日韩.国产.一区.二区 | 日韩制服丝袜先锋影音| 久久在线视频免费观看| 久久99高清| 欧美成人精品午夜一区二区| 日韩二区三区四区| 国产麻豆一区二区三区精品视频| 美国三级日本三级久久99| 中文无码久久精品| 日本91福利区| 国产精品嫩模av在线| 另类小说一区二区三区| 五月天av在线| 亚洲一区日韩在线| 亚洲毛片网站| 日韩**一区毛片| 久久男人av资源站| 欧美性感美女一区二区| 99视频精品全国免费| 欧美成人午夜| 日韩精品一卡二卡三卡四卡无卡| 日韩精品视频中文字幕| 麻豆精品视频在线观看免费| 国产成人精品福利| 欧美成人日韩| 欧美精品中文字幕亚洲专区| 四季av一区二区凹凸精品| 日韩精品一卡| 亚洲精品无吗| 色偷偷偷在线视频播放| 亚洲性视频在线| 国产亚洲一区二区手机在线观看 | 欧美日韩一视频区二区| 麻豆传媒一区二区三区| 婷婷国产精品| 欧美视频久久| 亚洲欧美伊人| 国产九九精品| 亚洲电影在线一区二区三区| 日产欧产美韩系列久久99| 日韩精品诱惑一区?区三区| 日韩黄色av| 亚洲精品国产嫩草在线观看 | 婷婷精品在线| 国产一区亚洲| 日韩avvvv在线播放| 国产精品99免费看| 精品一区二区三区亚洲| 国产精品呻吟| 久久最新视频| 91久久午夜| 亚洲成人二区| 欧美日韩精品免费观看视欧美高清免费大片 | 蜜桃视频一区二区三区在线观看 | 婷婷精品久久久久久久久久不卡| 日本欧美不卡| 日韩精品电影| 国产成人精品亚洲线观看| 日韩精品一区二区三区中文在线 | 国产精品免费不| 日韩国产高清在线| 在线免费观看亚洲| 麻豆精品91| 综合精品一区| 天海翼精品一区二区三区| 欧美一区成人| 日韩和欧美的一区| 奇米777国产一区国产二区| 日韩极品在线观看| 日本午夜精品一区二区三区电影 | 久久久久免费av| 日韩欧美另类一区二区| 精品91福利视频| 国产精品久久久久77777丨| 国产调教一区二区三区| 久久av影院| 黑森林国产精品av| 日韩和的一区二在线| 欧美日韩水蜜桃| 中文一区在线| 一本综合精品| 久久不见久久见中文字幕免费| 免费亚洲一区| 亚洲第一精品影视| 久久不射网站| 综合一区在线| 国产精品密蕾丝视频下载| 国产一区二区三区国产精品| 欧洲在线一区| 蜜桃视频一区二区| 国产欧美激情| 午夜精品久久久久久久久久蜜桃| 欧美精品一线| 国产剧情在线观看一区| 日韩精品dvd| 亚洲精品日本| 99国产精品久久久久久久成人热 | 99久久夜色精品国产亚洲狼 | 亚洲一区免费| 国产一区精品福利| 免费不卡在线视频| 精品72久久久久中文字幕| 欧洲激情综合| 国产精品扒开腿做爽爽爽软件| 久久久成人网| 国产色噜噜噜91在线精品| 日韩在线短视频| 日韩精品1区2区3区| 韩国三级一区| 国产精品亚洲片在线播放| 91精品精品| 欧美日韩18| 一区视频在线| 蜜臀国产一区| 美女精品久久| 日本视频在线一区| 91久久午夜| 国产网站在线| 国产极品久久久久久久久波多结野| 久久黄色影院|