久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么理解MySQL change buffer

141次閱讀
沒有評論

共計 2624 個字符,預計需要花費 7 分鐘才能閱讀完成。

本篇內(nèi)容介紹了“怎么理解 MySQL change buffer”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

change buffer 是 MySQL5.5 加入的新特性,change buffer 是 insert buffer 的加強,insert buffer 只針對 insert 有效,change buffer 對 insert、delete、update(delete+insert)、purge 都有效。當修改一個索引塊 (secondary index) 時的數(shù)據(jù)時,索引塊在 buffter pool 中不存在,修改信息就會被 cache 在 change buffer 中,當通過索引掃描把需要的索引塊讀取到 buffer pool 時,會和 change buffer 中修改信息合并,再擇機寫回 disk。目的還是為了減少隨機 IO 帶來性能損耗,說明白了:把隨機 IO 盡量變成順序 IO。
Change buffer 的主要目的是將對二級索引的數(shù)據(jù)操作緩存下來,以此減少二級索引的隨機 IO,并達到操作合并的效果。
change buffer 是存放二級索引的沒有在 buffer pool 的變更頁的緩存區(qū),變更的 buffer 是由 insert,update,delete 等操作導致的。等頁被加載進 buffer pool 中后會將 change buffer 中的頁合并。 
二級索引通常是非唯一的,插入也是很隨機的順序,更新刪除也都不是在鄰近的位置,所以 change buffer 就避免了很多的隨機 io 的產(chǎn)生。puge 操作會在系統(tǒng)空閑或慢關(guān)閉的時候定時將變更頁寫入到磁盤上去。 
change buffer 合并在有大量的二級索引頁更新或有很多影響行的情況下會花費很長的時間。change buffer 會占用 innodb buffer pool 的部分空間,在磁盤上,change buffer 會占用系統(tǒng)表空間,所以在數(shù)據(jù)庫重啟后,索引變更仍然被緩存。在 change buffer 中被緩存的數(shù)據(jù)可以使用 innodb_change_buffering 控制,我們也可以調(diào)整 innodb_change_buffer_max_size 配置 change buffer 的大小。

索引對 insert 的影響

1、表 insert,對應表上的所有索引都需要 insert;

2、假設(shè)這些索引不常使用,容易產(chǎn)生物理讀;

3、索引的順序和表的順序完全不一致;

原則:一個表上的索引最好不超過 6 個

將對索引的更新記錄存入 insert buffer 中,而不是直接調(diào)入索引頁進行更新;擇機進行 merge insert buffer 的操作,將 insert buffer 中的記錄合并 (merge) 到真正的輔助索引中。
解決了 insert 表數(shù)據(jù)產(chǎn)生過多物理讀的問題。
Insert Buffer 何時 merge
有 2 種情況 innodb 會 merge Insert Buffer 到磁盤  
1),master loop 線程主動 merge
若過去 1s 之內(nèi)發(fā)生的 I /O,小于系統(tǒng) I / O 能力的 5%,則主動進行一次 Insert buffer 的 merge 操作。Merge 的頁面數(shù)為系統(tǒng) I / O 能力的 5%,每 10s,必定觸發(fā)一次 insert buffer merge 動作.
Merge 的頁面數(shù)仍舊為系統(tǒng) I / O 能力的 5% (系統(tǒng)能力指 innodb_io_capacity)

2), 讀取數(shù)據(jù)發(fā)現(xiàn)該 page 在 Insert Buffer 還沒有被 merge, 那么 innodb 首先會做一個 merge 操作,所以此時讀取的速度會降低

在系統(tǒng)負載較高時,merge 操作會很少,而在系統(tǒng)比較空閑時,merge 操作會非常頻繁,所以當你的系統(tǒng)突然負載變低時,DB 還有可能會進行很長一段時間的 IO 操作。

merge insert buffer 的操作可能發(fā)生在什么情況下:
在 merge insert buffer 之前,insert buffer 數(shù)據(jù)是存在內(nèi)存中,為了防止數(shù)據(jù)庫意外宕機導致數(shù)據(jù)丟失,系統(tǒng)會周期性將 insert buffer 數(shù)據(jù)寫入共享表空間中。
1、輔助索引頁被讀取到 buffer pool 中
例如這在執(zhí)行正常的 select 查詢操作,索引頁被調(diào)入內(nèi)存,該索引頁對應在 insert buffer 中的索引更改記錄就會發(fā)生 merge 操作。
2、insert buffer bitmap 頁追蹤到該輔助索引頁已無可用空間時
存于 ibd 文件中(表數(shù)據(jù)文件)
記錄每一個索引頁在 insert buffer 中對應的行數(shù)

如何看 insert buffer 的效果
1、insert buffer 所占空間,占比太高就影響緩沖性能
2、每次 merge 處理的數(shù)據(jù)量
1)、merges 如果很高,說明 insert buffer 調(diào)小了,也說明索引建多了;
2)、對表進行批量 IDU 的時候,可能會導致 insert buffer 迅速增加。
關(guān)注 change buffer 在 innodb buffer pool 中的占比
mysql show variables like %change_buffer%
+——————————-+——-+
| Variable_name                 | Value |
+——————————-+——-+
| innodb_change_buffer_max_size | 25    |
| innodb_change_buffering       | all   |
+——————————-+——-+
2 rows in set (0.01 sec)
1、innodb_change_buffer_max_size:表示 change buffer 在 buffer pool 中的最大占比,默認 25%,最大 50%
2、innodb_change_buffering:表示索引列 merge 對象,all 表示對 IDU 索引列都起作用,都進行 merge,如果只想對 insert 索引列進行 merge,就把 all 改為 inserts。

調(diào)整建議:
1、如果系統(tǒng)中有嚴重的 insert、update 并且還有活躍的 delete 時,就增大 max_size;
2、針對不更改數(shù)據(jù)的純報表系統(tǒng),可以減小該參數(shù)值。

“怎么理解 MySQL change buffer”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實用文章!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-24發(fā)表,共計2624字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 嘉荫县| 张北县| 赫章县| 织金县| 廊坊市| 浦江县| 万盛区| 阿荣旗| 洛宁县| 安仁县| 舞阳县| 大连市| 靖西县| 横峰县| 通化市| 广灵县| 仪陇县| 稷山县| 本溪| 东源县| 五莲县| 巢湖市| 教育| 襄城县| 巴东县| 新营市| 宁德市| 江源县| 普宁市| 迁安市| 德保县| 咸宁市| 黄平县| 南投市| 宜宾市| 北辰区| 芜湖市| 开阳县| 汝城县| 徐汇区| 鄂伦春自治旗|