InnoDB關鍵特性

2021-08-29 01:26:40 字數 3360 閱讀 7976

innodb使用insert buffer"欺騙"資料庫:對於為非唯一索引,輔助索引的修改操作並非實時更新索引的葉子頁,而是把若干對同一頁面的更新快取起來做合併為一次性更新操作,轉化隨機io 為順序io,這樣可以避免隨機io帶來效能損耗,提高資料庫的寫效能。

ibuf_pool_size_per_max_size引數修改預設為2 即為最大快取為1/2 如果將其改為3 這最大能夠使用1/3的快取池記憶體。

innodb 1.0.x才開始引用 是insert buffer的公升級版,

innodb儲存引擎可以對dml操作————insert、dekete、update進行緩衝,他們分別是:insert buffer、delete buffer、purge buffer。

change buffer物件也是非唯一的輔助索引。

對一條記錄進行update操作可能分為兩個過程:

(1)delete buffer對應 update操作將記錄標記為已刪除;

(2)purge buffer對應update操作真正將記錄刪除。

innodb 2.0.x 開始通過引數 innodb_change_buffer_max_size來控制 查詢:show variables like 'innodb_change_buffer_max_size'\g

預設為25 即為1/4的緩衝池記憶體空間。最大為50值即為1/2的緩衝池記憶體空間。

insert buffer 是一棵b+樹,因此其也由葉節點和非葉節點組成。非葉節點存放的是查詢的 search key(鍵值)

如圖:

(1)輔助索引頁被讀取到緩衝池時,

(2)insert buffer bitmap 頁追蹤到該輔助索引頁已無可用空間時;

doublewrite由兩部分組成,一部分是記憶體的doublewrite buffer,大小為2mb,另一部分是物理磁碟上共享表空間中聯絡的128個頁,即2個區(extent),大小同樣為2mb。

髒讀重新整理先複製到記憶體中的doublewrite buffer,之後doublewrite buffer再分兩次,每次1mb寫入共享表空間的物理磁碟,然後馬上呼叫fsync函式,同步磁碟,避免緩衝寫帶來的問題。如圖:

通過命令show global status like 'innodb dblwr%'\g觀察doublewrite執行的情況。

innodb儲存引擎會監控各索引頁的查詢。如果觀察到簡歷雜湊所以可以帶來的速度提公升,則建立雜湊索引,稱為自適應雜湊索引(adaptive hash index,ahi)。ahi是通過緩衝池的b+樹頁構造而來,因此建立的速度很快,而且不需要對整張表構建雜湊索引。innodb儲存引擎會自動根據訪問的頻率和墨水來自動地為某些熱點頁建立雜湊索引。

ahi有個要求,連續訪問模式必須一樣的例如:

啟用之後讀取寫入可以提高2倍。輔助索引可以提高5倍。

通過show engine innodb status\g;檢視狀態:

通過結果可以考慮是禁用還是啟動此特性,預設ahi啟用;

為了提高磁碟操作效能,當前的資料庫系統都採用非同步io(asynchronous io,aio)的方式來處理磁碟操作。

與aio對應的是 sync io,sync io每次進行io操作 需要等到改操作結束才能繼續接下來的操作。但是如果使用者是一條索引掃瞄的查詢,那麼需要掃瞄索引頁,也就是需要進行多次的io操作。如果是這樣的話就沒有必要了。

引數innodb_use_native_aio 控制師傅啟動 liunx預設不啟動。

官方顯示,啟用native aio,恢復速度可以提高75%。

read ahead方式讀取都是通過aio完成,髒頁的重新整理和磁碟寫入操作則全部由aio完成。

innodb儲存引擎還提供了flush neighbor page(重新整理鄰接頁)的特性。工作原理:當重新整理髒頁時,innodb儲存引擎會檢測所在區的所有頁,如果是髒頁,那麼一起進行重新整理。

引數innodb_flush_neighbors 控制是否啟用改特性.如果是機械硬碟建議啟用,如果是固態硬碟就不建議使用 iops效能的磁碟 則建議設定為0,關閉此特性。

關閉時引數innodb_fast_shutdown影響著表儲存引擎innodb的行為。該引數可取值為0、1、2,預設為1

當正常關閉mysql資料庫時,下次的啟動應該會非常「正常」。但是沒有正常關閉 如用kill命令關閉資料庫,在mysql 資料庫執行中重啟伺服器,或者關閉資料庫時,將引數innodb_fast_shuidown設為了2時,下次mysql資料庫啟動時都會對innodb儲存引擎的表進行恢復操作。

引數innodb_force_recovery影響了正規innodb儲存引擎恢復的狀況。預設為0,代表當發生需要恢復時,進行所有恢復的操作,當不能進行有效恢復時,如資料頁傳送了corruption,mysql資料庫可能傳送宕機(crash),並把錯誤寫入錯誤日誌中去。

如果使用者知道怎麼進行恢復 比如進行alter table操作是發生意外了,資料庫重啟會對innodb進行回滾操作,對於大表淶水需要很長時間,所以可以把錶刪除,從備份中匯入資料到表。速度就會比回滾操作快。

如果innodb_force_recovery 設定為3 則不需要回滾,因此資料庫很快就啟動完成了。 但是需要仔細確認是否需要回滾事務操作。

innodb 關鍵特性

插入緩衝 innodb儲存引擎對於非聚集索引的插入或更新操作,不是每一次直接插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩衝池,若在,則直接插入 不在,則先放在乙個insert buffer物件中。資料庫這個非聚集的索引已經插到葉子節點,而實際並沒有,知識存放在另乙個位置。然後再以一定的頻率和...

InnoDB的關鍵特性

1 插入緩衝 insert buffer 對於非聚集索引頁的插入或更新操作,不是每一次直接插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩衝池中,若在則直接插入 若不在則先放入到乙個insert buffer物件中。看似資料庫這個非聚集的索引已經插入到葉子節點,實際並沒有,只是存放在另乙個位置。...

InnoDB關鍵特性之double write

一 髒頁刷盤風險 關於io的最小單位 1 資料庫io的最小單位是16k mysql預設,oracle是8k 2 檔案系統io的最小單位是4k 也有1k的 3 磁碟io的最小單位是512k 因此,存在io寫入導致page損壞的風險 二 doublewrite 兩次寫 提高innodb的可靠性,用來解決...