MySQL InnoDB的4個特性

insert buffer

Double write

adaptive hash index 自適應哈希索引

read-ahead

insert buffer

對於為非唯一索引,輔助索引的修改操作並非實時更新索引的葉子頁,

而是把若干對同一頁面的更新緩存起來做合併為一次性更新操作,

轉化隨機IO 為順序IO,提高寫性能。

Double write

提高可靠性,主要用來解決部分寫失敗(partial page write)

doublewrite有兩部分組成,

一部分是內存中的doublewrite buffer,大小為2M,

另外一部分就是物理磁盤上的共享表空間中連續的128個頁,即兩個區,大小同樣為2M。

當緩衝池的作業刷新時,並不直接寫硬盤,而是通過memcpy函數將髒頁先拷貝到內存中的doublewrite buffer,

之後通過doublewrite buffer再分兩次寫,每次寫入1M到共享表空間的物理磁盤上,然後馬上調用fsync函數,同步磁盤。

查看doublewrite的使用 情況

show global status like ‘innodb_dblwr%’

slave上可以通過設置skip_innodb_doublewrite參數關閉兩次寫功能來提高性能

master上一定要開啟此功能,保證數據安全

自適應哈希索引

監控表上索引的查找,如果觀察到建立哈希索引可以提升速度,則建立哈希索引,所以稱之為自適應(adaptive)的。

通過緩衝池的B+樹構造而來,因此建立的速度很快。需要將整個表都建哈希索引,自動根據訪問的頻率

限制

1.只能用於等值比較,例如=, <=>,in

2.無法用於排序

3.有衝突可能

4.自動管理,無法人為干預。

預讀 read-ahead

提供兩種預讀的方式,

一種是 Linear read ahead,由參數innodb_read_ahead_threshold控制,

當連續讀取一個 extent 的 threshold 個 page 的時候,會觸發下一個 extent 64個page的預讀。

另外一種是Random read-ahead,由參數innodb_random_read_ahead控制,當連續讀取設定的數量的page後,會觸發讀取這個extent的剩餘page。

預讀由後臺線程異步完成的。啟動innodb_read_io_threads個後臺線程,


分享到:


相關文章: