MySQL系列(二) InnoDB的應用技術概述

  • 5 緩衝池 概述

    • 緩衝池是一塊內存區域,用來彌補磁盤速度讀寫速度過慢的影響
    • 首先將磁盤讀的數據放到緩衝池中,而後進行頁的斷定,減小IO
    • 緩衝池頁類型:索引頁,數據頁,undo頁,插入緩衝,自適應哈希索引,鎖信息等
    • 緩衝池容量滿從額外緩衝池中申請
  • 6 管理緩衝池的 LRU 算法

    LRU 算法前端

    • 最頻繁使用的頁在LRU 列表的最前端,最少使用的在最後端,最後端的優先釋放

    優化 LRU 算法算法

    • 最新訪問的頁放到 midpoint 中節點位置,在列表長度的5/8處
    • 中節點 以前的成爲 new列表,以後的成爲 old 列表。

    爲何採用優化 LRU 算法數據庫

    • 由於若是直接將讀取到的頁放到 LRU 列表首部,那麼某些索引或數據的掃描操做可能將 LRU 列表的頁大量甚至所有刷新,可是掃描的這些數據僅本次使用,並非活躍的熱點數據,因此就會致使真正的熱點數據被刷新出。
    • 所以優化LRU 算法提供了一個參數,用於表示頁讀取到 中節點位置後,須要等待多久纔會被加入到 LRU 列表的熱端。
  • 7 checkpoint 技術(強制刷新髒頁)

    • 應用背景後端

      若是每一次一個頁發生變化,就當即刷新到磁盤,那麼開銷是很是大的。若是在從緩衝池將頁的新版本刷新到磁盤時發生了宕機,那麼數據就不能恢復了。異步

      當前事務數據庫廣泛採用write ahead log 策略,當事務提交時,先寫重作日誌,再修改頁。這也是事務中持久性的要求。性能

    • 主要解決如下問題優化

      縮短數據庫的恢復時間;設計

      緩衝池不夠用時,將髒頁刷新到磁盤;日誌

      重作日誌不可用時,刷新髒頁。code

    當數據庫發生宕機時,不須要重作全部日誌,由於checkpoint 以前的頁都刷新到磁盤了。這樣就縮短了恢復的時間。此外,當緩衝池不夠用時,根據LRU 算法回溢出最少使用的頁,而後對其強制執行checkpoint,刷新到磁盤。

    checkpoint 的時間,條件,髒頁的選擇都是很是複雜的。好比每次刷新多少頁,從哪裏取髒頁,什麼時間觸發checkpoint。InnoDB 提供了兩種checkpoint選擇:

    • sharp checkpoint 敏捷的
    • fuzzy checkpoint 模糊的

    sharp 發生在數據庫關閉時,默認將全部髒頁都刷新到磁盤。

    fuzzy 發生在運行時,只刷新一部分髒頁。刷新是異步的。

  • 8 插入緩衝

    在InnoDB中,主鍵是惟一的行標識。所以,插入彙集索引通常都是順序的,不須要磁盤的隨機讀取。不過非彙集索引其插入和索引都是隨機的。

    固然,B+樹的特性決定了非彙集索引的插入的離散性。由於數據頁所在的葉子節點是按照邏輯順序離散存放的。

    InnoDB存儲引擎開創性地設計了Insert Buffer(插入緩衝),對於非彙集索引的插入或更新操做,不是每一次直接插入到索引頁中,而是先判斷插入的非彙集索引頁是否在緩衝池中,若在,則插入到緩衝池中的非彙集索引頁;若不在,則先放入到一個Insert Buffer對象中,好似欺騙。

    數據庫這個非彙集的索引沒有直接插到葉子節點,只是存放在另外一個位置。而後再以必定的頻率和狀況進行插入 Insert Buffer 和輔助索引頁子節點的merge(合併)操做,一般能將多個插入合併到一個操做中(由於在一個索引頁中),這就大大提升了對於非彙集索引插入的性能。

    然而Insert Buffer的使用須要同時知足如下兩個條件:

    • 索引是輔助索引(secondary index)
    • 索引不是惟一(unique)的

    當知足以上兩個條件時,InnoDB存儲引擎會使用 Insert Buffer,這樣就能提升插入操做的性能了。不過考慮這種狀況:

    • 應用程序進行大量的插入操做,這些都涉及了不惟一的非彙集索引,也就是使用了Insert Buffer。若此時MySQL數據庫發生了宕機,這時勢必有大量的Insert Buffer並無合併到實際的非彙集索引中去。所以這時恢復可能須要很長的時間,在極端狀況下甚至須要幾個小時。
    • 輔助索引不能是惟一的,由於在插入緩衝時,數據庫並不去查找索引頁來判斷插入的記錄的惟一性。若是去查找確定又會有離散讀取的狀況發生,從而致使Insert buffer 失去了意義。
  • 9 兩次寫

    • 做用
      • 插入緩衝帶來性能上的提高。
      • 兩次寫 double write 帶來的是數據頁數據的可靠性。
    • 描述
      • 針對部分寫失效:在寫的過程當中發生了宕機。
      • 經過日誌來恢復的話,重作日誌記錄的是對頁的物理操做,若是那個頁自己發生了損壞,那麼恢復就是沒有意義的。所以須要一個副本,當寫入失效時,先經過頁的副本還原該頁,這就是double write。
    • 實現
      • double write 由兩部分組成
        • 一部分是內存中的 double writer buffer,大小爲2M。
        • 另外一部分爲物理磁盤上共享表空間中連續的128 個頁,即2個區, 大小一樣爲2M。
      • 對緩衝池中的髒頁進行刷新時,並不直接寫入磁盤,而是經過 double write buffer 分兩次每次1M順序的寫入共享表空間的物理磁盤上,而後再同步磁盤,避免緩衝區的問題。最後再寫入各個表空間文件中,此時的寫入過程是離散的,所以系統壓力不大。

    默認狀況下全部頁的刷新首先放入到 double write中。

相關文章
相關標籤/搜索