InnoDB存儲引擎關鍵特性

1、插入緩衝Insert Buffer--給InnoDB存儲引擎帶來了性能
插入緩衝和數據頁一樣,是物理頁的一個組成部分。
(1)主鍵primary key是行唯一的標識符,在應用程序中行記錄的插入順序是按照主鍵遞增的順序進行插入的->插入聚集索引一般是順序的,不需要磁盤隨機讀取。
(2)非聚集的輔助索引secondary index不唯一,進行插入操作時,非聚集索引葉子結點的插入不是順序的,折舊需要離散的訪問非聚集索引頁,插入性能低(B+樹的特性決定了非聚集索引的離散性)
插入緩衝->對於非聚集索引的插入或更新操作,不是每一次直接插入,而是先判斷插入的非聚集索引頁是否在緩衝池中,在則直接插入;否則先放入一個插入緩衝區中,再以一定的頻率執行插入緩衝和非聚集索引葉子結點的合併。
mysql> show engine innodb status;
...
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 7545, free list len 3790, seq size 11336, 
8075308 inserts, 7540969 merged recs, 2246304 merges
...
7545已用,3790空閒,11336插入緩衝大小=7545+3790,8075308插入的記錄數,7540969合併的頁的數量,2246304合併的次數,7540969:2246304≈3:1
注:插入緩衝默認情況下最大可以佔用1/2的緩衝池內存,可修改IBUF_POOL_SIZE_PER_MAX_SIZE進行控制。
插入緩衝使用的條件:
(1)索引是輔助索引;
(2)索引不是唯一的。
2、兩次寫Double Write--給InnoDB存儲引擎帶來數據的可靠性
部分失效partial page write:當數據庫宕機時,數據庫正在寫一個頁面且只寫了一部分導致數據丟失->根本原因是mysql的page size跟系統文件的page size不一致,導致在寫數據時,系統並不是把整個buffer pool page一次性寫到disk上。(比如16K的頁,只寫了前4K)
重做日誌redo log:記錄的是對頁的物理操作,如偏移量800,寫'AAA'記錄,即如果這個頁本身已經損壞,再對其進行重做已經沒有任何意義。
兩次寫double write:在應用apply重做日誌前,我們需要一個頁的副本,當寫入失效發生時,先通過副本來還原該頁,再進行重做,這就是double write。
恢復工作方式:如果是寫doublewrite buffer本身失效,那麼這些數據不會被寫到磁盤,innodb此時會從磁盤載入原始數據,然後再通過log files計算出正確的數據,重新寫入到doublewrite buffer;如果是寫磁盤失敗,則直接用buffer的數據再寫一遍。
doublewrite架構如下圖所示:

doublewrite
內存中的doublewrite buffer,大小爲2MB;
物理磁盤上共享表空間中連續的128頁,大小爲2MB(2MB=2*1MB=2*64*16KB=2*64頁)。
過程描述
當緩衝池的髒頁刷新時flush dirty page,並不直接寫磁盤,而是會通過memcpy函數將髒頁拷貝到內存中的doublewrite buffer,之後通過doublewrite buffer分兩次,每次寫入1MB到共享表空間的物理磁盤上,然後馬上調用fsync函數同步磁盤,避免緩衝寫帶來的問題。
->在這個過程中,因爲doublewrite頁是連續的,因此整個過程是順序寫的,開銷並不是很大;在完成doublewrite頁寫入後,再將doublewrite buffer中的頁寫入到各個表空間文件中,此時的寫則是離散的。
Innodb_dblwr_pages_written:Innodb_dblwr_writes≈64:1(一次可刷新64個髒頁),而當系統寫入壓力並不是很高時,遠小於64:1。
在master/slave主從複製結構中,master server需開啓兩次寫功能;slave server應禁用兩次寫功能。
3、自適應哈希索引Adaptive Hash Index
哈希hash->非常快的查找方法O(1),常用於join操作(SQL Server和Oracle中的哈希連接)
設計思想:數據庫自優化->InnoDB存儲引擎會監控對錶上索引的查找,如果觀察到建立哈希索引可以帶來速度的提升,則建立哈希索引->通過緩衝池的B+樹構造,因此建立速度很快,且不需要將整個表都建立哈希索引,InnoDB存儲引擎會自動根據訪問的頻率和模式來爲某些頁建立哈希索引。其只能用來搜索等值的查詢,如select * from table where index_col='xxx'。
啓用自適應哈希索引後,讀寫速度可提高2倍,對輔助索引的連接操作性能可提高5倍。
mysql> show engine innodb status;
...
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 7545, free list len 3790, seq size 11336, 
8075308 inserts, 7540969 merged recs, 2246304 merges
Hash table size 4980499, node heap has 1246 buffer(s)
1640.60 hash searches/s, 3709.46 non-hash searches/s
...
1640.60:3709.46≈1:2.26

參考:<MySQL技術內幕 InnoDB存儲引擎>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章