<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
InnoDB架構圖
why buffer pool ?
InnoDB是基於磁碟儲存,其儲存的最基本單元是頁,大小為16KB。而CPU和磁碟之間速度相差懸殊,所以通常使用記憶體中的緩衝池來提高效能。
what is buffer pool ?
緩衝池裡主要快取了:
data page 資料頁
index page 索引頁
insert buffer
what is insert buffer ?
插入緩衝, 用於將多個insert操作合併成一個,減少IO開銷,提高插入效能。只能用在非唯一的輔助索引。
why ?
插入主鍵索引時是順序的,不需要隨機IO,速度會很快。但對於非唯一的輔助索引,插入的葉子節點是分散的,需要離散的存取索引頁。
how does it work ?
對非唯一輔助索引,索引的修改並非實時更新索引樹的葉子節點,而是把若干個對同一頁的更新操作快取起來,合併為一次操作,從隨機IO轉為順序IO,減少IO次數,提高寫入效能。
流程:
先判斷要更新的索引頁,是否在緩衝池中
extend :
一開始只針對INSERT操作,所以叫insert buffer,後來能夠支援 INSERT/UPDATE/DELETE,所以改叫change buffer了
若是唯一索引,在插入時需要檢查索引列的值是否存在,故在修改索引之前,需要把相關的索引頁讀出來,去判斷是否唯一,這時Insert Buffer就失效了。
lock info 鎖資訊
data dictionary 資料字典(主要包括了一些後設資料資訊,如表結構資訊)
adaptive hash index 自適應hash索引,InnoDB為熱點頁建立的索引,用以提高查詢效率
how does it work ?
資料庫的讀操作,會先判斷欲讀取的頁是否在緩衝池中,若是,則命中緩衝;否則,從磁碟上讀取,並將讀取到的頁放入緩衝池。
資料庫的寫操作,是先修改緩衝池中的頁,再以一定頻率,將緩衝池重新整理到磁碟。將資料從緩衝池重新整理到磁碟,是通過一種checkPoint的機制完成的
practice ?
可通過設定引數innodb_buffer_pool_size
來設定緩衝池大小
可以看到本機的mysql緩衝池大小為134217728B,換算後是128MB
why redo log buffer ?
當緩衝池中的頁是髒頁(修改資料時,是先修改緩衝池中的資料,此時緩衝池中的資料和磁碟上不一致,稱為髒頁)時,需要通過某種機制將髒頁重新整理到磁碟。若緩衝池中一有資料頁發生改變,就馬上重新整理磁碟,效率會很低。所以InnoDB採用Write Ahead Log策略,事務提交時,先將redo log寫入磁碟,這樣就認為髒頁已經寫入到磁碟了。之後再通過checkpoint機制擇時將髒頁真正寫入磁碟,髒頁真正寫入磁碟後,就可以刪掉對應的redo log了。若髒頁還沒寫入磁碟,發生了宕機,則由於redo log已經成功寫入磁碟,故可以通過redo log進行資料恢復。
redo log保證了事務的永續性。寫redo log時,先將redo log放入redo log buffer,再將redo log按一定策略重新整理到磁碟,這是通過innodb_flush_log_at_trx_commit
引數來設定的,引數名在不同的mysql版本或許有不一樣,通過如下命令可以檢視:
show variables like 'innodb_flush%';
innodb_flush_log_at_trx_commit引數設定有3個取值:0,1,2 其含義如下圖所示
innodb_flush_log_at_trx_commit屬性可以控制每次事務提交時InnoDB的行為。當屬性值為0時,事務提交時,redo log被寫到redo log buffer,然後等待主執行緒按時寫入;當屬性值為1時,事務提交時,會將redo log寫入檔案系統快取,並且呼叫檔案系統的fsync,將檔案系統緩衝中的資料真正寫入磁碟儲存,確保不會出現資料丟失;當屬性值為2時,事務提交時,也會將紀錄檔檔案寫入檔案系統快取,但是不會呼叫fsync,而是讓檔案系統自己去判斷何時將快取寫入磁碟。
當引數值為0時,寫入效率最高,但是資料安全最低;引數值為1時,寫入效率最低,但是資料安全最高;引數值為2時,二者都是中等水平。一般建議將該屬性值設定為1,以獲得較高的資料安全性,而且也只有設定為1,才能保證事務的永續性。
redo log buffer的大小可以通過innodb_log_buffer_size去控制
雙寫緩衝,和磁碟檔案中系統表空間裡的Double Write Segment一起解決了頁的部分寫入失效問題。
MySQL資料庫IO的最小單位是16KB,檔案系統(File System)IO的最小單位是4KB,磁碟IO的最小單位是512B。(具體的大小可能有差異,但意思就是這麼個意思,MySQL的基本儲存單位和檔案系統的基本儲存單位大小不一致)。由於MySQL的1個單位(頁),相當於檔案系統中的4個單位,在將記憶體中的髒頁重新整理到磁碟時,一頁會分4次進行寫入,若在寫入過程中發生意外情況,比如斷電,宕機,則可能成功寫入2次,即寫入了8KB,那另外8KB還是舊的資料,這叫做部分寫失敗,導致這一頁的資料,一半是新的,一半是舊,資料不完整,成為壞頁,最終資料不一致。此時redo log 也無能為力,因為redo log記錄的是對物理頁的修改操作,此時頁本身已經損壞,再對損壞的頁應用修改操作,也無法恢復為完整資料。
Double Write就是為了解決這個問題。
Double Write 由2部分組成
它的工作機制是這樣的
若發生意外宕機等情況,先從共用表空間中取出Double Write資料,複製到表空間中,再應用redo log,這樣即完成了資料恢復。
優點:
提高了資料的可靠性
缺點:
由於Double Write 實際是一個物理檔案,即是一個file,它會導致作業系統進行更多的fsync刷盤操作,所以它會降低mysql的效能。然而,double write buffer往磁碟寫的時候是順序寫入,效能很高。
可以關閉Double Write的場景
簡單來說,就是加了一箇中間層,先將要寫入磁碟的資料,暫存到一箇中繼站,成功存到中繼站之後,再進行實際的寫磁碟,寫完磁碟後,再告訴中繼站說,剛才暫存到你那裡的資料我已經落盤了,你可以把它標記為無用資料了。相當於拿這個中繼站做了資料的保險。如果在實際寫磁碟時,發生意外,那麼損壞的資料塊,我可以從中繼站那裡拿到一份完整的拷貝,保證了資料的完整性。
系統表空間(共用表空間 ibdata1)
它是被多個表共用的,可以通過innodb_data_file_path
引數對系統表空間進行設定
# 格式 innodb_data_file_path = datafile1[,datafile2] # 可以指定多個檔案,共同組成系統表空間 innodb_data_file_path = /db/ibdata1:1000M;/db/ibdata2:1000M # 設定了這個引數後,所有基於InnoDB的表,都會被儲存到系統表空間
使用者表空間(獨立表空間 ibd)
# 開啟獨立表空間 innodb_file_per_table = 1 # 設定這個引數後,每個表都是一個單獨的 .ibd 檔案
我本機的MySQL是預設開啟了這個引數
所以都是一個表一個ibd檔案
但是獨立表空間裡,只存了資料,索引,插入緩衝bitmap。其餘的資訊還是存在系統表空間。
redo log :
一般InnoDB的資料目錄下,會有2個名為ib_logfile0和ib_logfile1的檔案,這就是redo log檔案
每個InnoDB引擎的表至少要有1個重做紀錄檔組(group),一個group下至少有2個重做紀錄檔。為了得到更高的可靠性,使用者可設定多個映象紀錄檔組
InnoDB根據checkpoint對2個檔案進行迴圈寫入。
可通過innodb_log_file_size設定redo log的大小。若設定太大,資料丟失時,恢復可能要花很長時間;若設定太小,則會導致checkpoint進行頻繁檢查,並將髒頁重新整理到磁碟,導致效能抖動。
重做紀錄檔的落盤機制在上面的redo log buffer裡已經說明,簡單總結起來就是2個機制:Write Ahead Log + Force Log at Commit
這兩者保證了事務的永續性
一次寫操作的事務流程如下圖所示:
若發生了崩潰,則恢復資料的過程如下圖所示:
binlog是維護在SQL Layer層的,故不包含在InnoDB中。
以上就是MySQL學習之InnoDB結構探祕的詳細內容,更多關於InnoDB結構探祕的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45