Mysql innodb引擎(一)緩衝和索引

雲逸_發表於2018-09-05

1.緩衝池:

  • 所有對資料庫的操作首先修改緩衝池中的頁,在合適的 checkpoint 再寫入磁碟儲存中。
  • 緩衝池的大小決定著資料庫的效能。
  • 緩衝池通過 LRU 的演算法進行管理。即使用最多的頁在前端,最少使用的在尾端。當緩衝池不能存新的頁的時候,將首先清理尾端的頁。頁大小預設為16KB,
  • innodb 優化了 LRU 演算法,在 LRU 的列表中加入了 midpoint 的位置。每次最新訪問的頁放入到 midpoint 的位置,預設為5/8的地方。預設 LRU 演算法是直接插入頭部,但是為了增加熱度較高頁面的存活時間,所以在中部插入。避免了大量 SQL 查詢導致的高熱度頁被刷出

2.兩次寫:

為了避免在當機時,正好資料庫在寫入某頁面列表中,導致了頁面被汙染,但是又使用重做日誌又沒有乾淨的頁面可以直接重寫。所以 mysql 對髒頁進行更新的時候,使用了兩次寫的方案來解決。

  • 兩次寫擁有額外的兩個不同的儲存地址。一個是記憶體的 doublewirte buffer 一個是物理磁碟上的共享空間,都是2MB 正好是128頁。
  • 在對緩衝池的髒頁重新整理時,先將髒頁複製到 buffer 中。然後在分兩次把 buffer 的內容順序的寫入到記憶體共享空間。然後再從 buffer 同步磁碟。整個過程都是順序的。如果一旦出現異常,可以通過恢復共享空間的資料到表空間檔案,再使用重做日誌的方式來實現恢復。

3.索引:(B+樹後面會單獨寫一篇來對比與其他資料結構的區別)

innoDB 有3中索引:B+樹索引、hash 索引、全文索引 B+索引具有高扇出性,樹的高度一般在2-4層

3.1自適應 hash 索引:

  • hash 索引是系統自行選擇建立的,不能人工建立
  • 通過快取池的 B+樹結構來建立的

3.2B+樹索引:

3.2.1使用目的(為什麼使用 b+tree):

  • b+樹在同樣的資料量下可以有效的減少樹的層級,有效的減少查詢時候的 I/O次數
  • 對比紅黑樹,b+樹的節點是按範圍進行儲存,有效的提高的了查詢效率
  • 對比平衡二叉樹,b+樹不需要使用大量的處理去維護最優,同時又能保證查詢的高效

3.2.1聚合索引:

  • 通過主鍵建立的索引
  • 葉子節點裡面的資料就是對應的行資料
  • 由於葉子節點間使用雙向鏈方式。所以範圍查詢非常便利

3.2.2輔助索引:

  • 通過設定值進行建立索引
  • 葉子節點上通過 bookmark 儲存對應引用,本引用是對應主鍵。所以查詢流程是先走輔助索引的樹,然後去走聚合索引的樹。IO 次數是2顆樹高度相加

3.2.3聯合索引:

按建立聯合索引的鍵的順序全排列出所有的 key 組合。例如index(a,b) -> (1,1) (1,2)(2,1)(2,2)。如果使用 where A=XXX and B=XXX & where a=XXX 都可以使用到這個聯合索引。但是where b=xxx 是不能使用到的。聯合索引的組合方式實際上對a b c。。。等聯合鍵值都進行了排序。所以where a=xxx order by b是可以使用到索引的

3.3全文索引:

待補充

Mysql innodb引擎(二)鎖

Mysql innodb引擎(三)事務

相關文章