InnoDB為此設計了Insert Buffer來進行插入優化。對於非聚簇索引的插入或者更新操作,不是每一次都直接插入到索引頁中,而是先判斷插入的非聚集索引是否在緩衝池中,若在,則直接插入;若不在,則先放入到一個Insert Buffer中。看似資料庫這個非聚集的索引已經查到葉節點,而實際沒有,這時存放在另外一個位置。然後再以一定的頻率和情況進行Insert Buffer和非聚簇索引頁子節點的合併操作。這時通常能夠將多個插入合併到一個操作中,這樣就大大提高了對於非聚簇索引的插入性能。
自適應哈希索引是通過緩衝池的B+樹頁構建而來,因此建立速度很快,而且不需要對整張數據表建立哈希索引。其 有一個要求,即對這個頁的連續訪問模式必須是一樣的,也就是說其查詢的條件(WHERE)必須完全一樣,而且必須是連續的。
數據字典是對資料庫中的數據、庫對象、表對象等的元信息的集合。在MySQL中,數據字典信息內容就包括表結構、資料庫名或表名、欄位的數據類型、視圖、索引、表欄位信息、存儲過程、觸發器等內容。MySQL INFORMATION_SCHEMA庫提供了對數據局元數據、統計信息、以及有關MySQL server的訪問信息(例如:資料庫名或表名,欄位的數據類型和訪問許可權等)。該庫中保存的信息也可以稱為MySQL的數據字典。
InnoDB有buffer pool(簡稱bp)。bp是資料庫頁面的緩存,對InnoDB的任何修改操作都會首先在bp的page上進行,然後這樣的頁面將被標記為dirty並被放到專門的flush list上,後續將由master thread或專門的刷臟線程階段性的將這些頁面寫入磁碟(disk or ssd)。這樣的好處是避免每次寫操作都操作磁碟導致大量的隨機IO,階段性的刷臟可以將多次對頁面的修改merge成一次IO操作,同時非同步寫入也降低了訪問的時延。然而,如果在dirty page還未刷入磁碟時,server非正常關閉,這些修改操作將會丟失,如果寫入操作正在進行,甚至會由於損壞數據文件導致資料庫不可用。為了避免上述問題的發生,Innodb將所有對頁面的修改操作寫入一個專門的文件,並在資料庫啟動時從此文件進行恢復操作,這個文件就是redo log file。這樣的技術推遲了bp頁面的刷新,從而提升了資料庫的吞吐,有效的降低了訪問時延。帶來的問題是額外的寫redo log操作的開銷(順序IO,當然很快),以及資料庫啟動時恢復操作所需的時間。
redo日誌由兩部分構成:redo log buffer、redo log file。innodb是支持事務的存儲引擎,在事務提交時,必須先將該事務的所有日誌寫入到redo日誌文件中,待事務的commit操作完成才算整個事務操作完成。在每次將redo log buffer寫入redo log file後,都需要調用一次fsync操作,因為重做日誌緩衝只是把內容先寫入操作系統的緩衝系統中,並沒有確保直接寫入到磁碟上,所以必須進行一次fsync操作。因此,磁碟的性能在一定程度上也決定了事務提交的性能。
InnoDB 存儲引擎先將重做日誌信息放入這個緩衝區,然後以一定頻率將其刷新到重做日誌文件。重做日誌文件一般不需要設置得很大,因為在下列三種情況下重做日誌緩衝中的內容會刷新到磁碟的重做日誌文件中。