中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解MySQL的Insert buffer

發布時間:2021-11-18 15:55:05 來源:億速云 閱讀:263 作者:iii 欄目:MySQL數據庫

本篇內容介紹了“怎么理解MySQL的Insert buffer”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

 我們知道在進行插入操作時,數據頁的存放還是按主鍵id的執行順序存放, 但是對于非聚集索引,葉子節點的插入不再是順序的了。
例如,對于如下表結構進行insert操作
create table tab ( 
  id int auto_increment, 
  name varchar(30),
  primary key (id),
  key(name)
 ) engine=innodb  default charset=utf8;
nanme 為非唯一字段,這時就需要離散地訪問非聚集索引頁,插入性能在這里變低了。然而這并不是這個name字段上索引的錯誤,因為B+樹的特性決定了非聚集索引插入的離散性。
為了解決非聚族索引的隨機寫性能差,InnoDB 存儲引擎開發了 innsert-buffer pool (5.5 中做了加強,稱之為 change buffer pool)

一 什么是 innsert-buffer pool
innodb使用insert buffer"欺騙"數據庫:對于為非唯一索引,輔助索引的修改操作并非實時更新索引的葉子頁,而是把若干對同一頁面的更新緩存起來做合并為一次性更新操作,轉化隨機IO 為順序IO,這樣可以避免隨機IO帶來性能損耗,提高數據庫的寫性能。
1.1 原理:
   a 先判斷要更新的這一頁在不在內存中。
   b 如果不在,則讀取index page 存入Insert Buffer,按照Master Thread的調度規則來合并非唯一索引和索引頁中的葉子結點.

1.2 Master Thread的調度規則
  a 主動merger[innodb主線程定期完成,用戶線程無感知]
    主動merger:
    原理:主動merge通過innodb主線程(svr_master_thread)判斷:若過去1s之內發生的I/O小于系統I/O能力的5%,
        則主動進行一次insert buffer的meger操作。meger的頁面數為系統I/O能力的5%,讀取采用async io模式。
        每10s,必定觸發一次insert buffer meger操作。meger的頁面數仍舊為系統 I/O能力的5%。
    步驟:
        1.主線程發出async io請求,async讀取需要被meger的索引頁面
        2.I/O handler 線程,在接受到完成的async I/O之后,進行merger
  b 被動merge[用戶線程完成,用戶能感受到meger操作帶來的性能影響]
    被動merge:
      情況一:
      insert操作,導致頁面空間不足,需要分裂(split)。由于insert buffer只針對單個頁面,不能buffer page split[頁已經在內存里],因此引起頁面的被動meger。同理,update操作導致頁面空間不 足;purge導致頁面為空等。總之:若 當前操作引起頁面split or merge,那么就會導致被動merge。
      情況二:
      insert操作,由于其它各種原因,insert buffer優化返回false,需要真正讀取page時,要進行被動merge。與一不同的是,頁在disk上,需要讀取到內存里。
      情況三:
      在進行insert buffer操作,發現insert buffer太大,需要壓縮insert buffer,這時需要強制被動merge,不允許 insert 操作進行。

二 為什么要求是非唯一索引呢?
因為
  1 主鍵是行唯一的標示符,當app 寫入行時,是按照主鍵遞增的順序進行插入的,異常插入聚族索引一般也順序的,不需要隨機IO。
  2 寫唯一索引要檢查記錄是不是存在,所以在修改唯一索引之前,必須把修改的記錄相關的索引頁讀出來才知道是不是唯一,這樣Insert buffer就沒意義了,反正要讀出來(讀帶來隨機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顯示了當前插入緩沖的大小為2 *16KB,大約為32KB,free list len代表了空閑列表的長度,size代表了已經合并記錄頁的數量。merges 表示合并次數。
merged operations:
Inserts代表插入的記錄數,delete mark delete 次數均為0.

四 insert buffer 增強之 change buffering
    change buffering 是MySQL5.5加入的新特性,change buffering是insert buffer的加強,insert buffer只針對insert有效,change buffering對insert、delete、update(delete+insert)、purge都有效。當修改一個索引塊(secondary index)時的數據時,索引塊在buffter pool中不存在,修改信息就會被cache在change buffer中,當通過索引掃描把需要的索引塊讀取到buffer pool時,會和change buffer中修改信息合并,再擇機寫回disk。目的還是為了減少隨機IO帶來性能損耗,說明白了:把隨機IO盡量變成順序IO。

“怎么理解MySQL的Insert buffer”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东兰县| 西峡县| 武功县| 门头沟区| 宁安市| 元氏县| 台东市| 昭通市| 鹿邑县| 黎城县| 罗江县| 海安县| 若尔盖县| 天长市| 玛纳斯县| 宝山区| 洪江市| 迭部县| 开鲁县| 神农架林区| 海南省| 荣昌县| 增城市| 措勤县| 宜宾市| 潢川县| 兰溪市| 霍林郭勒市| 昌宁县| 莱州市| 靖宇县| 阿鲁科尔沁旗| 新余市| 巨野县| 曲阳县| 黄龙县| 措勤县| 桐庐县| 白山市| 蒙自县| 论坛|