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