您好,登錄后才能下訂單哦!
本篇內容介紹了“InnoDB的內存結構及特性”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
?InnoDB存儲引擎支持事務,其設計目標主要面向在線事務處理(OLTP)的應用。其特點是行鎖設計、支持外鍵,并支持非鎖定讀,即默認讀操作不會產生鎖。
?InnoDB通過使用多版本并發控制(MVCC)來獲取高并發性,并且實現了SQL標準的4中隔離級別,默認為REPEATABLE級別。同時,使用一種被稱為next-key-locking的策略來避免幻讀現象的產生。除此之外,InnoDB存儲引擎還提供了插入緩沖(insert buffer)、二次寫(double write)、自適應哈希索引(adaptive hash index)、預讀(read ahead)等高性能和高可用的功能。
?InnoDB存儲引擎是基于磁盤存儲的,并將其中的記錄按照頁的方式進行管理。但是由于CPU速度和磁盤速度之間的鴻溝,基于磁盤的數據庫系統通常使用緩沖池記錄來提高數據庫的的整體性能。
?在數據庫中進行讀取操作,首先將從磁盤中讀到的頁放在緩沖池中,下次再讀相同的頁中時,首先判斷該頁是否在緩沖池中。若在緩沖池中,稱該頁在緩沖池中被命中,直接讀取該頁。否則,讀取磁盤上的頁。
?對于數據庫中頁的修改操作,則首先修改在緩沖池中的頁,然后再以一定的頻率刷新到磁盤上。頁從緩沖池刷新回磁盤的操作并不是在每次頁發生更新時觸發,而是通過一種稱為CheckPoint的機制刷新回磁盤。
?所以,緩沖池的大小直接影響著數據庫的整體性能,可以通過配置參數innodb_buffer_pool_size來設置。
?具體來看,緩沖池中緩存的數據頁類型有:索引頁、數據頁、undo頁、插入緩沖(insert buffer)、自適應哈希索引(adaptive hash index)、InnoDB存儲的鎖信息(lock info)和數據字典信息(data dictionary)。
?在架構圖上可以看到,InnoDB存儲引擎的內存區域除了有緩沖池之外,還有重做日志緩沖和額外內存池。InnoDB存儲引擎首先將重做日志信息先放到這個緩沖區中,然后按照一定頻率將其刷新到重做日志文件中。重做日志緩沖一般不需要設置的很大,該值可由配置參數innodb_log_buffer_size控制。
?Page是Innodb存儲的最基本結構,也是Innodb磁盤管理的最小單位,與數據庫相關的所有內容都存儲在Page結構里。Page分為幾種類型,數據頁和索引頁就是其中最為重要的兩種類型。
?我們都知道,在InnoDB引擎上進行插入操作時,一般需要按照主鍵順序進行插入,這樣才能獲得較高的插入性能。當一張表中存在非聚簇的且不唯一的索引時,在插入時,數據頁的存放還是按照主鍵進行順序存放,但是對于非聚簇索引葉節點的插入不再是順序的了,這時就需要離散的訪問非聚簇索引頁,由于隨機讀取的存在導致插入操作性能下降。
?InnoDB為此設計了Insert Buffer來進行插入優化。對于非聚簇索引的插入或者更新操作,不是每一次都直接插入到索引頁中,而是先判斷插入的非聚集索引是否在緩沖池中,若在,則直接插入;若不在,則先放入到一個Insert Buffer中。看似數據庫這個非聚集的索引已經查到葉節點,而實際沒有,這時存放在另外一個位置。然后再以一定的頻率和情況進行Insert Buffer和非聚簇索引頁子節點的合并操作。這時通常能夠將多個插入合并到一個操作中,這樣就大大提高了對于非聚簇索引的插入性能。
?如果說Insert Buffer給InnoDB存儲引擎帶來了性能上的提升,那么Double Write帶給InnoDB存儲引擎的是數據頁的可靠性。
?如上圖所示,Double Write由兩部分組成,一部分是內存中的double write buffer,大小為2MB,另一部分是物理磁盤上共享表空間連續的128個頁,大小也為2MB。在對緩沖池的臟頁進行刷新時,并不直接寫磁盤,而是通過memcpy函數將臟頁先復制到內存中的該區域,之后通過doublewrite buffer再分兩次,每次1MB順序地寫入共享表空間的物理磁盤上,然后馬上調用fsync函數,同步磁盤,避免操作系統緩沖寫帶來的問題。在完成doublewrite頁的寫入后,再講doublewirite buffer中的頁寫入各個表空間文件中。
?如果操作系統在將頁寫入磁盤的過程中發生了崩潰,在恢復過程中,InnoDB存儲引擎可以從共享表空間中的doublewrite中找到該頁的一個副本,將其復制到表空間文件中,再應用重做日志。
?當緩沖池中的頁的版本比磁盤要新時,數據庫需要將新版本的頁從緩沖池刷新到磁盤。但是如果每次一個頁發送變化,就進行刷新,那么性能開發是非常大的,于是InnoDB采用了Write Ahead Log策略,即當事務提交時,先寫重做日志,然后再擇時將臟頁寫入磁盤。如果發生宕機導致數據丟失,就通過重做日志進行數據恢復。
?InnoDB存儲引擎會首先將重做日志信息先放入重做日志緩沖中,然后再按照一定頻率將其刷新到重做日志文件。重做日志緩沖一般不需要設置得很大,因為一般情況每一秒鐘都會講重做日志緩沖刷新到日志文件中。可通過配置參數innodb_log_buffer_size控制,默認為8MB。
?除了每秒刷新機制之外,每次事務提交時重做日志緩沖也會刷新到日志中。InnoDB是事務的存儲引擎,其通過Force Log at Commit機制實現事務的持久性,即當事務提交時,必須先將該事務的所有日志寫入到重做日志文件進行持久化,然后事務的提交操作完成才算完成。InnoDB的寫入機制大致入下圖所示。
?為了確保每次日志都寫入到重做日志文件,在每次講重做日志緩沖寫入重做日志后,必須調用一次fsync操作,將緩沖文件從文件系統緩存中真正寫入磁盤。
?可以通過innodb_flush_log_at_trx_commit來控制重做日志刷新到磁盤的策略。該參數默認值為1,表示事務提交必須進行一次fsync操作,還可以設置為0和2。0表示事務提交時不進行寫入重做日志操作,該操作只在主線程中完成,2表示提交時寫入重做日志,但是只寫入文件系統緩存,不進行fsync操作。由此可見,設置為0時,性能最高,但是喪失了事務的一致性。
?InnoDB會根據訪問的頻率和模式,為熱點頁建立哈希索引,來提高查詢效率。InnoDB存儲引擎會監控對表上各個索引頁的查詢,如果觀察到建立哈希索引可以帶來速度上的提升,則建立哈希索引,所以叫做自適應哈希索引。
?自適應哈希索引是通過緩沖池的B+樹頁構建而來,因此建立速度很快,而且不需要對整張數據表建立哈希索引。其有一個要求,即對這個頁的連續訪問模式必須是一樣的,也就是說其查詢的條件(WHERE)必須完全一樣,而且必須是連續的。
?我們都知道,InnoDB存儲引擎會在行級別上對表數據進行上鎖。不過InnoDB也會在數據庫內部其他很多地方使用鎖,從而允許對多種不同資源提供并發訪問。數據庫系統使用鎖是為了支持對共享資源進行并發訪問,提供數據的完整性和一致性。關于鎖的具體知識我們之后再進行詳細學習。
?InnoDB有自己的表緩存,可以稱為表定義緩存或者數據字典。當InnoDB打開一張表,就增加一個對應的對象到數據字典。
?數據字典是對數據庫中的數據、庫對象、表對象等的元信息的集合。在MySQL中,數據字典信息內容就包括表結構、數據庫名或表名、字段的數據類型、視圖、索引、表字段信息、存儲過程、觸發器等內容。MySQL INFORMATION_SCHEMA庫提供了對數據局元數據、統計信息、以及有關MySQL server的訪問信息(例如:數據庫名或表名,字段的數據類型和訪問權限等)。該庫中保存的信息也可以稱為MySQL的數據字典。
“InnoDB的內存結構及特性”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。