插入緩衝(insert buffer)
- 主要是插入性能提高。解決頻繁數據更新帶來的b+tree頻繁自平衡工做。
- 對於非彙集索引的插入/更新操做先判斷非彙集索引的頁是否在緩衝池中,若在則直接插入。
- 若不在則先放入到一個InsertBuffer中,而後按必定頻率對InsertBuffer和輔助索引頁進行merge操做。
- 這是一種插入合併,減小b+tree重排。
- 索引不能是主鍵索引,主鍵索引爲彙集索引,大多爲自增。若是爲UUID類型,則可使用InsertBuffer
- 索引非惟一,由於數據庫並不會去查找索引頁來判斷插入的惟一性。
- 1.2之後進行了升級,Change Buffer,將DML操做細分爲InsertBuffer, DeleteBuffer, PurgeBuffer
- update時,DeleteBuffer是第一個過程,標記爲刪除。PurgeBuffer爲第二個過程,真正移除。
- InsertBuffer的內部實現是一顆B+tree,負責對全部表的的輔助索引進行InsertBuffer。
- 它存放在共享表空間中,也就是ibdata1中,因此經過ibd進行文件恢復時,須要進行RepairTable重建表上輔助索引。
二次寫(double write)
- 主要是可靠性提高,解決髒頁-->磁盤過程當中,未徹底寫入時宕機的問題。
- 分寫失效問題:16KB的頁只寫了4KB就發生宕機。因爲重作日誌是對頁的物理操做,若是頁已經發生損壞,對損壞頁重作是沒有意義的。
工做流程
1. 髒頁-->磁盤過程當中,先複製到doublewriteBuffer中,而後doubleWriteBuffer分兩次,每次1M寫入共享表空的doublewrite上。
2. 完成共享表空間的doublewrite寫操做之後,再將內存中的doubleWriteBuffer寫入各個表空間中。完成雙寫操做。
3. 若是髒頁同步過程當中發生崩潰,mysql會從共享表空間中doublewrite找到該頁的一個副本,複製到各個表空間文件中再應用重作日誌。
自適應哈希索引(ahi)
- Hash查找的時間複雜度爲O(1),而B+tree的查找次數通常約等於3~4層。innodb會根據訪問頻率和模式來自動爲某些熱點頁創建hash。
- 要求訪問模式也就是查詢條件固定且爲=搜索,而不是範圍檢索。
- 當以該模式訪問了100次,且頁經過該模式訪問了N次,其中N=頁中記錄數*1/16。
異步IO(Async IO)
- 能夠同時發送多個IO請求,而後等待全部IO操做完成。
- IO Merge:將多個合成爲一個IO,例如訪問的頁(space, page_no)爲(8,6)(8,7)(8,8),則合成爲一個IO請求從(8,6)開始。連續讀48K頁面。
刷新鄰接頁(Flush Neighbor Page)
- 磁盤預讀原理。當刷新一個髒頁時,InnoDB會檢測該頁所在區的全部頁,若是是髒頁則一塊兒刷新。
- 經過AIO將多個IO操做合併爲同一個,減小磁盤IO次數。
- 對傳統硬盤有顯著優點。可是在SSD中能夠將此參數設置爲0,即關閉。