一、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物件中。看似資料庫這個非聚集的索引已經插入到葉子節點,實際並沒有,只是存放在另乙個位置。...