InnoDB關鍵特性 非同步IO 重新整理鄰接頁

2021-10-08 23:51:53 字數 2132 閱讀 8685

一、io分類

1)同步io(sync io),即每次io操作,需要等待此次操作結束後,才能繼續接下來的操作;

2)aio(asynchornous io),發出乙個io請求後立即發出另外乙個io請求,當全部的io請求發布完成後,等待所有的io操作完成;

3)native aio,核心級別提供的非同步io支援;

二、非同步io

2.1 非同步io解決了什麼問題

若沒進行一次io操作,需要等待此次操作結束後才能繼續接下來的操作。如果使用者發出的是一條索引掃瞄的查詢,那麼這條sql查詢語句可能需要掃瞄多個索引頁,即多次進行io操作,在每掃瞄乙個頁完成後,再掃瞄另外乙個頁,這是完全沒有必要的。

使用者可以發出乙個io請求後,立即發出另外乙個io請求,當全部的io請求傳送完畢後,等待所有的io操作完成,這就是aio。

2.2 io合併(io merge)

aio另外乙個優勢就是可以進行io merge操作,也就是將多個io合併為乙個io操作,可以提高iops效能。例如使用者需要訪問頁的(page, page_no)為:

(8,6),(8,7),(8,8)

每個頁的大小為16k,那麼需要同步io進行3次io操作。而aio會判斷這三個頁是否是連續的,若是。因此aio底層會傳送乙個io請求,從(8,6)開始讀取,讀取48k的頁。

三、native aio

在innodb1.1.x之前,aio是通過innodb儲存引擎的**來模擬實現的。而從innodb1.1.x開始,提供了核心級別的aio的支援,成為native aio。windows和linux預設支援native io。

3.1 啟用native aio開關

引數innodb_use_native_aio用來控制是否啟用native aio,在linux作業系統下,預設值為on:

mysql> show variables like'innodb_use_native_aio'

;+-----------------------+-------+

| variable_name | value |

+-----------------------+-------+

| innodb_use_native_aio | on |

+-----------------------+-------+

3.2 效能的提公升

使用者可以通過開啟和關閉native aio功能來比較innodb效能的提公升。官方的測試顯示,啟用native aio,恢復速度可以提高75%。

3.3 aio使用的場景

在innodb儲存引擎中,read ahead方式的讀取都是通過aio完成,髒頁的重新整理,即磁碟的寫入操作則全部由aio完成。

四、重新整理鄰接頁

4.1 重新整理鄰接頁的原理

當沒重新整理乙個髒頁時,innodb儲存引擎會檢測該頁所在的區(extent)的所有頁,是否是髒頁。如果是髒頁,那麼一起重新整理。

4.2 重新整理鄰接頁的優勢

1)aio可以將多個io的寫入操作合併成乙個io操作。故在傳統的機械磁碟下有著顯著的優勢

4.3 重新整理鄰接頁的不足

1)是否可能不需要將髒頁進行寫入,而這個髒頁寫入之後,又很快變成了髒頁;

2)固態硬碟有較高的iops,是否需要這個特性;

4.4 引數控制

控制開關:innodb_flush_neighbors

mysql> show variables like '%neigh%'

;+------------------------+-------+

| variable_name | value |

+------------------------+-------+

| innodb_flush_neighbors | 1 |

#預設重新整理鄰接頁功能開啟

+------------------------+-------+

1 row in

set(0.00 sec)

0,表示關閉重新整理鄰接頁

1、表示開啟了重新整理鄰接頁的功能,順帶著重新整理在 buffer pool 中位於磁碟上相同的 extend 區的相鄰的髒頁。

2 ,表示重新整理在 buffer pool 中位於磁碟上相同的 extend 區的髒頁。

InnoDB關鍵特性

innodb使用insert buffer 欺騙 資料庫 對於為非唯一索引,輔助索引的修改操作並非實時更新索引的葉子頁,而是把若干對同一頁面的更新快取起來做合併為一次性更新操作,轉化隨機io 為順序io,這樣可以避免隨機io帶來效能損耗,提高資料庫的寫效能。ibuf pool size per ma...

innodb 關鍵特性

插入緩衝 innodb儲存引擎對於非聚集索引的插入或更新操作,不是每一次直接插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩衝池,若在,則直接插入 不在,則先放在乙個insert buffer物件中。資料庫這個非聚集的索引已經插到葉子節點,而實際並沒有,知識存放在另乙個位置。然後再以一定的頻率和...

InnoDB的關鍵特性

1 插入緩衝 insert buffer 對於非聚集索引頁的插入或更新操作,不是每一次直接插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩衝池中,若在則直接插入 若不在則先放入到乙個insert buffer物件中。看似資料庫這個非聚集的索引已經插入到葉子節點,實際並沒有,只是存放在另乙個位置。...