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

怎么理解MySQL的Insert buffer

145次閱讀
沒有評論

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

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

  我們知道在進行插入操作時,數據頁的存放還是按主鍵 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”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-19發表,共計2551字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 浑源县| 苏尼特左旗| 三穗县| 贵州省| 汝州市| 大厂| 神农架林区| 绥滨县| 文化| 安龙县| 景德镇市| 崇仁县| 田林县| 舟曲县| 韩城市| 张掖市| 沂源县| 安丘市| 利津县| 镶黄旗| 吴堡县| 宜城市| 德清县| 镇安县| 汤原县| 贺州市| 靖远县| 南昌县| 贵德县| 松阳县| 巴彦县| 石狮市| 莒南县| 安化县| 韶山市| 桃园市| 临潭县| 稷山县| 凤山县| 四会市| 安徽省|