本篇內(nèi)容介紹了“怎么理解MySQL的Insert buffer”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、謝通門網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為謝通門等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
我們知道在進(jìn)行插入操作時,數(shù)據(jù)頁的存放還是按主鍵id的執(zhí)行順序存放, 但是對于非聚集索引,葉子節(jié)點的插入不再是順序的了。
例如,對于如下表結(jié)構(gòu)進(jìn)行insert操作
create table tab (
id int auto_increment,
name varchar(30),
primary key (id),
key(name)
) engine=innodb default charset=utf8;
nanme 為非唯一字段,這時就需要離散地訪問非聚集索引頁,插入性能在這里變低了。然而這并不是這個name字段上索引的錯誤,因為B+樹的特性決定了非聚集索引插入的離散性。
為了解決非聚族索引的隨機(jī)寫性能差,InnoDB 存儲引擎開發(fā)了 innsert-buffer pool (5.5 中做了加強(qiáng),稱之為 change buffer pool)
一 什么是 innsert-buffer pool
innodb使用insert buffer"欺騙"數(shù)據(jù)庫:對于為非唯一索引,輔助索引的修改操作并非實時更新索引的葉子頁,而是把若干對同一頁面的更新緩存起來做合并為一次性更新操作,轉(zhuǎn)化隨機(jī)IO 為順序IO,這樣可以避免隨機(jī)IO帶來性能損耗,提高數(shù)據(jù)庫的寫性能。
1.1 原理:
a 先判斷要更新的這一頁在不在內(nèi)存中。
b 如果不在,則讀取index page 存入Insert Buffer,按照Master Thread的調(diào)度規(guī)則來合并非唯一索引和索引頁中的葉子結(jié)點.
1.2 Master Thread的調(diào)度規(guī)則
a 主動merger[innodb主線程定期完成,用戶線程無感知]
主動merger:
原理:主動merge通過innodb主線程(svr_master_thread)判斷:若過去1s之內(nèi)發(fā)生的I/O小于系統(tǒng)I/O能力的5%,
則主動進(jìn)行一次insert buffer的meger操作。meger的頁面數(shù)為系統(tǒng)I/O能力的5%,讀取采用async io模式。
每10s,必定觸發(fā)一次insert buffer meger操作。meger的頁面數(shù)仍舊為系統(tǒng) I/O能力的5%。
步驟:
1.主線程發(fā)出async io請求,async讀取需要被meger的索引頁面
2.I/O handler 線程,在接受到完成的async I/O之后,進(jìn)行merger
b 被動merge[用戶線程完成,用戶能感受到meger操作帶來的性能影響]
被動merge:
情況一:
insert操作,導(dǎo)致頁面空間不足,需要分裂(split)。由于insert buffer只針對單個頁面,不能buffer page split[頁已經(jīng)在內(nèi)存里],因此引起頁面的被動meger。同理,update操作導(dǎo)致頁面空間不 足;purge導(dǎo)致頁面為空等??傊?若 當(dāng)前操作引起頁面split or merge,那么就會導(dǎo)致被動merge。
情況二:
insert操作,由于其它各種原因,insert buffer優(yōu)化返回false,需要真正讀取page時,要進(jìn)行被動merge。與一不同的是,頁在disk上,需要讀取到內(nèi)存里。
情況三:
在進(jìn)行insert buffer操作,發(fā)現(xiàn)insert buffer太大,需要壓縮insert buffer,這時需要強(qiáng)制被動merge,不允許 insert 操作進(jìn)行。
二 為什么要求是非唯一索引呢?
因為
1 主鍵是行唯一的標(biāo)示符,當(dāng)app 寫入行時,是按照主鍵遞增的順序進(jìn)行插入的,異常插入聚族索引一般也順序的,不需要隨機(jī)IO。
2 寫唯一索引要檢查記錄是不是存在,所以在修改唯一索引之前,必須把修改的記錄相關(guān)的索引頁讀出來才知道是不是唯一,這樣Insert buffer就沒意義了,反正要讀出來(讀帶來隨機(jī)IO),所以只對非唯一索引有效。
三 如何查看insert buffer
我們可以通過show engine innodb status \G 來查看插入緩沖的信息
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 2920 merges
merged operations:
insert 23858, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
seg size顯示了當(dāng)前插入緩沖的大小為2 *16KB,大約為32KB,free list len代表了空閑列表的長度,size代表了已經(jīng)合并記錄頁的數(shù)量。merges 表示合并次數(shù)。
merged operations:
Inserts代表插入的記錄數(shù),delete mark delete 次數(shù)均為0.
四 insert buffer 增強(qiáng)之 change buffering
change buffering 是MySQL5.5加入的新特性,change buffering是insert buffer的加強(qiáng),insert buffer只針對insert有效,change buffering對insert、delete、update(delete+insert)、purge都有效。當(dāng)修改一個索引塊(secondary index)時的數(shù)據(jù)時,索引塊在buffter pool中不存在,修改信息就會被cache在change buffer中,當(dāng)通過索引掃描把需要的索引塊讀取到buffer pool時,會和change buffer中修改信息合并,再擇機(jī)寫回disk。目的還是為了減少隨機(jī)IO帶來性能損耗,說明白了:把隨機(jī)IO盡量變成順序IO。
“怎么理解MySQL的Insert buffer”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
名稱欄目:怎么理解MySQL的Insertbuffer
URL鏈接:http://jinyejixie.com/article36/ipjppg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站改版、定制網(wǎng)站、用戶體驗、電子商務(wù)、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)