標籤:style blog http io color os ar java for
Mysql 筆記二
Mysql 筆記二Table of Contents
- 1. 前言
- 2. Master Thread 工作方式
- 2.1. 主迴圈(loop)
- 2.2. 後台循(backgroup loop)
- 2.3. 重新整理迴圈(flush loop)
- 2.4. 暫停迴圈(suspend loop)
- 3. InnoDB關鍵特性
- 3.1. 插入緩衝(Insert Buffer)
- 3.2. 兩次寫(Double Write)
- 3.3. 自適應雜湊索引(Adaptive Hash Index),預設開啟
- 3.4. 非同步IO(Async IO)
- 3.5. 重新整理鄰接頁(Flush Neighbor Page)
- 4. Mysql 啟動、關閉、恢複
- 4.1. innodb _fast _shutdown
- 4.2. innodb _force Srecovery
1 前言2 Master Thread 工作方式
Master Thread是最進階別的線程,控制著記憶體的管理
2.1 主迴圈(loop)
loop迴圈是主要的迴圈,大多操作是在這個迴圈中完成的,有兩大操作:每秒操作和每10秒操作
- 每一秒操作
- 日誌緩衝重新整理到磁碟(總是)
- 合并插入緩衝(可能)
- 至多重新整理100個InnoDB緩衝池中的髒頁(可能)
- 如果當前沒有使用者活動,切換到backgroup loop
- 每十秒操作
- 重新整理100個髒頁到磁碟(可能)
- 合并最多5個插入緩衝(總是)
- 將日誌重新整理到磁碟(總是)
- 刪除無用undo頁(總是)
- 重新整理100個或者10個髒頁到磁碟(總是)
2.2 後台循(backgroup loop)
- 刪除無用的Undo頁 (總是 )
- 合并20個插入緩衝 (總是)
- 跳到主迴圈(總是)
- 不斷重新整理100個頁直到符合條件(可能)
2.3 重新整理迴圈(flush loop)2.4 暫停迴圈(suspend loop)3 InnoDB關鍵特性 3.1 插入緩衝(Insert Buffer)
- 運用插入緩衝的兩個條件:
- 索引是輔助索引(Secondary index)
- 索引不是唯一的(Unique)
- 叢集索引、非叢集索引
- 對於非叢集索引的更新中,因為要離散尋找,所以會比較慢。所以Insert Buffer做的操作是:
- 先判斷插入的非聚集引頁是否在緩衝池中,在,則直接插入
- 不在,則先放一個Insert Buffer
- 再以一定頻率進行Insert Buffer和輔助引頁子節點合并
這通常能將多個插入合并到一個操作中,大大提高了非聚集引插入的效能 用命令可查看:
mysql> show engine innodb status\G; *************************** 1. row ***************************Type: InnoDBName: Status: =====================================141027 21:38:14 INNODB MONITOR OUTPUT=====================================Per second averages calculated from the last 8 seconds-----------------.....-------------------------------------INSERT BUFFER AND ADAPTIVE HASH INDEX-------------------------------------Ibuf: size 1, free list len 0, seg size 2, 0 mergesmerged operations:insert 0, delete mark 0, delete 0discarded operations:insert 0, delete mark 0, delete 0Hash table size 276707, node heap has 0 buffer(s)0.00 hash searches/s, 0.00 non-hash searches/s
3.2 兩次寫(Double Write)
- why Double Write 當發生宕機時,有些頁是16K的,可能唯寫了8K,導致了部分失效。重做日誌是針對頁來說的,如果這個頁本來就已經失效了,重做也沒意義。所以發生這種情況,我們一個頁的副本來還原該頁,再重做。這就是Double Write
- Double Write 架構 double write由兩部分組成,一部分是記憶體中的double write buffer,大小為2M,另一部分是物理磁碟上共用資料表空間的2個區,同樣為2M。對緩衝池的髒頁進行重新整理時,並不直接寫磁碟,而是先將髒頁複製到記憶體中的double write buffer,之後通過doublewrite buffer再分兩次,每次1M順序地定入共用資料表空間的物理磁碟,再馬上同步磁碟。 觀察命令:
mysql> show global status like ‘innodb_dblwr%‘\G;*************************** 1. row *************************** Variable_name: Innodb_dblwr_pages_written Value: 0*************************** 2. row *************************** Variable_name: Innodb_dblwr_writes Value: 0 2 rows in set (0.00 sec)
3.3 自適應雜湊索引(Adaptive Hash Index),預設開啟
- what is AHI InnoDB儲存引擎會監控對錶上各索引頁的查詢,如果觀察到建立雜湊索引可以帶來速度提升,則建立雜湊索引。AHI 是通過緩衝池的B=樹頁構造,建立速度很快
- AHI要求
- 對頁的連續訪問模式是一樣的。訪問模式一樣指的是查詢條件一樣
- 以該模式訪問了100次
- 頁通過該模式訪問了N次,其中N=頁中記錄*1/16
3.4 非同步IO(Async IO)
沒什麼好說的,非同步好處不用說
3.5 重新整理鄰接頁(Flush Neighbor Page)
當重新整理一個髒頁時,檢測該頁所在的區的所有頁,如果是髒頁,一起刷。
4 Mysql 啟動、關閉、恢複 4.1 innodb _fast _shutdown
在關閉時,參數innodb _fast _shutdown影響行為,參數可取值0、1、2,預設為1
- 0:表示MYSQL關閉時,要完成所有的full purge的merge insert buffer,重新整理所有的髒頁。如果對 MySQL升級,這個參數必須調0
- 1:預設值,不完成full purge和merge insert buffer,在緩衝池中的一些資料髒頁還是會重新整理回磁碟
- 2:不完成 full purge ,merge insert buffer,也不重新整理緩衝池,而是將日誌都寫入記錄檔,下次啟動進行恢複操作(recovery)
4.2 innodb _force Srecovery
影響恢複情況,預設為0
- 1:忽略檢查到的corrupt頁
- 2:阻止Master Thread運行
- 3:不進行事務的復原操作
- 4:不進行插入緩衝的合併作業
- 5:不查看撤銷日誌,裝未提交的事務視為已提交
- 6:不進行前滾操作
Date: <2014-10-28 周二>
Author: eqyun
Created: 2014-10-28 周二 13:25
Emacs 24.3.1 (Org mode 8.2.10)
Validate
Mysql 筆記二