多版本的實施 |
發(fā)布時間: 2012/8/24 17:32:36 |
因為InnoDB是多版本化的數(shù)據(jù)庫, 它必須保持關(guān)于表空間中舊版本行的信息。這個信息被存在名為rollback segment(在Oracle中模擬數(shù)據(jù)結(jié)構(gòu)之后)的數(shù)據(jù)結(jié)構(gòu)中。 內(nèi)部地,InnoDB往存在數(shù)據(jù)庫中的每一行中添加兩個域。一個6字節(jié)的域說明插入或更新該行的最后一個事務(wù)的事務(wù)識別符。同時,一個刪除也被內(nèi)部處理為一個更新,其中行中一個特殊的位被設(shè)置來標注該行為已刪除。每一行也包含一個稱為滾動指針的7字節(jié)域。滾動指針指向一個被寫到回滾片斷的撤銷日志記錄。如果該行被更新,撤銷日志記錄包含在該行被更新之前重建該行的內(nèi)容必需的的信息。
InnoDB使用在回滾片斷中的信息來執(zhí)行在事務(wù)回滾中需要的撤銷操作。它也使用這個信息來為一個持續(xù)讀構(gòu)建更早版本的行。
在回滾片斷中的撤銷日志被分為插入和更新撤銷日志。插入撤銷日志僅在事務(wù)回滾中需要,且只要事務(wù)一提交就可以被丟棄。更新撤銷日志也被用在持續(xù)讀中,而且它們僅在當前沒有被InnoDB分配給一個快照的事務(wù)之后被丟棄,這個快照在持續(xù)讀中可能會需要更新撤銷日志的信息來建立一個數(shù)據(jù)庫行的早期版本。
你必須記得規(guī)律地提交你的事務(wù),包括那些只發(fā)布持續(xù)讀的事務(wù)。否則, InnoDB不能從更新撤銷日志丟棄數(shù)據(jù),并且回滾片斷可能變得太大,填滿你的表空間。
在一個回滾片斷里,一個撤銷日志記錄的物理尺寸典型地小于相應(yīng)的已插入行或已更新行。你可以用這個信息來計算回滾片斷需要的空間。
在InnoDB多版本化方案中,當你用SQL語句刪除一行之時,該行沒有被從數(shù)據(jù)庫立即物理刪除掉。只有當InnoDB可以丟棄為刪除而被寫的更新撤銷日志記錄時,InnoDB也物理地從數(shù)據(jù)庫刪除相應(yīng)行和它的索引記錄。這個刪除操作被成為精華,它運行得很快,通常與做刪除的SQL語句花的時間在一個數(shù)量級。 在某一情景下,在那里,用戶以幾乎相同的比率,小批次地在表中插入和刪除行,凈化線程開始滯后是可能的,并且表變得越來越大,使得每樣事都是磁盤綁定的而且非常慢。即使表僅載有10MB有用的數(shù)據(jù),它可能變得用所有的死行占據(jù)10GB空間。在這種情況下,節(jié)流新操作,并分配更多的資源來凈化線程可能是比較好的。啟動選項和可設(shè)置全球變量innodb_max_purge_lag就是為這個目的而存在的。請參閱15.2.4節(jié),“InnoDB 啟動選項” 以獲得更多信息。 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |