gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;
? ? 之前的文章中,我們介紹過innodb的兩次寫特性,這里給出鏈接:
InnoDB的兩次寫特性
今天我們完善一下這部分的內容。
? ? 我們知道innodb數據頁的默認大小是16kb,磁盤和內存通過數據頁進行交互,在數據庫關閉的時候,innodb會將內存中的數據臟頁刷新到磁盤上。如果在刷新的過程中,數據頁發生了損壞,那么我們就無法使用redo log進行數據頁的恢復了。想要使用redo log進行數據恢復,首先要保證數據頁的完整性,Innodb的兩次寫就是為了解決數據頁損壞的問題的,它基于一種備份的思想,在數據頁刷盤之前先備份一份在兩次寫文件中,然后再進行數據刷盤。
? ?單一頁面的刷盤方法上面的文章中提到了,我們今天主要看在批量場景下innodb是如何使用兩次寫機制的。
? ? 在單一頁面的刷盤過程中,因為要先將數據頁從內存中的doublewrite_buffer刷到ibdata中,然后再從內存中刷到磁盤上,相當于磁盤IO次數增加,會導致數據庫的性能變差(安全和方便從來都是雙刃劍)。引入了批量刷盤之后,如果還采用單一頁面刷盤過程,那么性能肯定會急劇下降。在MySQL5.7中,innodb設置了最小的批量緩存單元,簡稱shard,該緩存單元隸屬于innodb buffer pool的每個instance,每個instance都有獨立的shart。與此同時,innodb引入了參數innodb_parallel_doublewrite_path和innodb_doublewrite_batch_size,其中第一個參數指的是“兩次寫”磁盤文件的絕對路徑,第二個參數指的是shard的大小。
? ?批量刷盤一般采用LRU的方法淘汰冷數據頁,當需要批量刷盤的時候,innodb會判斷當前頁面所屬的instance,然后找到對應的shard,查看當前shard是否已滿,如果沒滿,則將數據頁內容添加復制到該shard中。如果添加完成之后,shard已經寫滿,此時需要將shard緩存的數據頁寫入到兩次寫文件中,寫完之后再將兩次寫文件flush到磁盤中,最后將對應的真實頁面刷盤。由于是連續寫入多個頁面,所以性能比寫多次,每次寫一個頁面要好。
? ?數據恢復的時候,如果需要修復數據頁,那么innodb將會從"兩次寫"磁盤文件中讀取所需要的頁面,加載到內存中去,然后在此基礎上繼續做redo log的應用。
? ?最后,之所以需要"兩次寫",是因為磁盤寫入的時候,是以512字節為單位的原子寫入,不能保證16kb的數據頁一次性原子寫入,如果能保證每次寫入16kb的數據頁原子寫入,那么"兩次寫"也就失去了意義了。
有幫助的話還希望點下再看哈總結
以上是生活随笔為你收集整理的gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转股价高于正股价好吗?转股价高好还是低好
- 下一篇: 计算机支持协同工作不是多媒体应用,计算机