天天看點

innodb特性介紹

innodb特性:

    主體系結構:預設7個背景線程,4個io thread(insert buffer、log、read、write),1個master thread(優先級最高),1個鎖(lock)監控線程,1個錯誤監控線程。可以通過show engine innodb status來檢視。新版本已對預設的read thread和write thread分别增大到4個,可通過show variables like 'innodb_io_thread%'檢視。

    存儲引擎組成:緩沖池(buffer pool)、重做日志緩沖池(redo log buffer)以及額外的記憶體池(additional memory pool).具體配置可由show variables like 'innodb_buffer_pool_size'、show variables like

'innodb_log_buffer_size'、show variables like 'innodb_additional_mem_pool_size'來檢視。

    緩沖池:占最大塊記憶體,用來存放各種資料的緩存包括有索引頁、資料頁、undo頁、插入緩沖、自适應哈希索引、innodb存儲的鎖資訊、資料字典資訊等。工作方式總是将資料庫檔案按頁(每頁16k)讀取到緩沖池,然後按最近最少使用(lru)的算法來保留在緩沖池中的緩存資料。如果資料庫檔案需要修改,總是首先修改在緩存池中的頁(發生修改後即為髒頁),然後再按照一定的頻率将緩沖池的髒頁重新整理到檔案。通過指令show engine innodb status;來檢視。

    日志緩沖:将重做日志資訊先放入這個緩沖區,然後按一定頻率将其重新整理到重做日志檔案。

innodb特性介紹

    master thread:

    loop主循環每秒一次的操作:

      日志緩沖重新整理到磁盤,即使這個事務還沒有送出。(總是執行,是以再大的事務commit 

      的時間也是很快的)           

      合并插入緩沖(innodb目前一秒發生的io次數小于5次則執行)

      至多重新整理100個innodb的緩沖池中的髒頁到磁盤(超過配置的髒頁所占緩沖池比例則執

      行,在配置檔案中由innodb_max_dirty_pages_pac決定,預設是90,新版本是75,

      google建議是80)

      如果目前沒用使用者活動,切換到backgroud loop        

    loop主循環每10秒一次的操作:

      重新整理100個髒頁到磁盤(過去10秒IO操作小于200次則執行)

      合并至多5個插入緩沖(總是)

      将日志緩沖到磁盤(總是)

      删除無用的Undo頁(總是)

      重新整理100個或者10個髒頁到磁盤(有超過70%的髒頁,重新整理100個髒頁;否則重新整理10個髒頁)

      産生一個檢查點

    backgroud loop,若目前沒有使用者活動(資料庫空閑時)或者資料庫關閉時,就會切換到這個循環:

      合并20個插入緩沖(總是)

      跳回到主循環(總是)

      不斷重新整理100個頁,直到符合條件(可能在flush loop中完成)

    如果flush loop中也沒有什麼事情可以做了,InnoDB存儲引擎會切換到suspend_loop,将master thread挂起,等待事件的發生。若啟用了InnoDB存儲引擎,卻沒有使用任何InnoDB存儲引擎的表,那麼master thread總是處于挂起狀态

    插入緩沖:不是緩沖池的一部分,Insert Buffer是實體頁的一個組成部分,它帶來InnoDB性能的提高。根據B+算法(下文會提到)的特點,插入資料的時候會主鍵索引是順序的,不會造成資料庫的随機讀取,而對于非聚集索引(即輔助索引),葉子節點的插入不再是順序的了,這時需要離散地通路非聚集索引,插入性能在這裡變低了。InnoDB引入插入緩沖,判斷非聚集索引頁是否在緩沖池中,如果在則直接插入;不在,則先放在 插入緩沖區中。然後根據上述master thread中介紹的,會有一定的頻率将插入緩沖合并。此外,輔助索引不能是唯一的,因為插入到插入緩沖時,并不去查找索引頁的情況,否則仍然會造成随機讀,失去插入緩沖的意義了。插入緩沖可能會占緩沖池中記憶體,預設也能會占到1/2,是以可以将這個值調小點,到1/3。通過IBUF_POOL_SIZE_PER_MAX_SIZE來設定,2表示1/2,3表示1/3。

    兩次寫:  它帶來InnoDB資料的可靠性。如果寫失效,可以通過重做日志進行恢複,但是重做日志中記錄的是對頁的實體操作,如果頁本身損壞,再對其進行重做是沒有意義的。是以,在應用重做日志前,需要一個頁的副本,當寫入失效發生時,先通過頁的副本來還原該頁,再進行重做,這就是doublewire。

     恢複資料=頁副本+重做日志

innodb特性介紹

   自适應哈希索引:InnoDB存儲引擎提出一種自适應哈希索引,存儲引擎會監控對表上索引的查找,如果觀察到建立建立哈希索引會帶來速度的提升,根據B+樹和索引來建立哈希索引,是以稱之為自适應的。自适應哈希索引能用來搜尋in、和<=>的相等比較,不能加快範圍查詢等值的查詢,如select * from table where index_col='***', 此外自适應哈希是由InnoDB存儲引擎控制的,我們隻能通過innodb_adaptive_hash_index來禁用或啟用,預設開啟。

IO 程序:mysql 5.5 &  mysql 5.6.5 (10個),

I/O thread 0 state: waiting for i/o request (insert buffer thread)

I/O thread 1 state: waiting for i/o request (log thread)

I/O thread 2 state: waiting for i/o request (read thread)

I/O thread 3 state: waiting for i/o request (read thread)

I/O thread 4 state: waiting for i/o request (read thread)

I/O thread 5 state: waiting for i/o request (read thread)

I/O thread 6 state: waiting for i/o request (write thread)

I/O thread 7 state: waiting for i/o request (write thread)

I/O thread 8 state: waiting for i/o request (write thread)

I/O thread 9 state: waiting for i/o request (write thread)

以前的版本5.0以及之前的版本都是 4個IO 程序(1 log thread+ 1 insert buffer thread+1 read thread+ 1 write thread),從 innodb  plugin 開始,預設增加到10(1 log thread+ 1 insert buffer thread+4 read thread+ 4 write thread)個。

3. innodb  plugin 以前(包括windows)參數  innodb_file_io_threads (預設值為4)設定 io 程序的個數, 從innodb  plugin 開始不再使用參數  innodb_file_io_threads,分别用innodb_read_io_threads、 innodb_write_io_threads  分别來設定read和write thread 的個數。

繼續閱讀