要明白什么清空(purge)操作,你得明白什么是事務的多版本控制,即MVCC(multi-version concurrency control)。Innodb為了實現MVCC,
需要在表空間內保存老版本的記錄信息,這些信息存儲於回滾段中(rollback segment),所謂回滾段,在物理存儲上是UNDO log的記錄。
Purge到底做了些什么?其實它就相當於一個垃圾收集器。取個例子,當用戶下一個命令,如 “DELETE FROM t WHERE c = 1;”,
InnoDB 不會馬上刪除對應的記錄,它會做如下三件事情:
它標記此記錄為刪除(通過刪除標記位)
存儲原始的記錄到UNDO log
更新記錄列DB_TRX_ID和DB_ROLL_PTR(這些列是Innodb在原記錄列上增加的)。DB_TRX_ID記錄了最后操作記錄的事務ID。
DB_ROLL_PTR也叫回滾指針(rollback pointer),指向UNDO log 記錄,此UNDO Log記錄了原始記錄的信息,這些信息可以
用來重建原始記錄(如發生了rollback的情況)。如果操作是插入,還會有一個DB_ROW_ID,這個指明了新記錄的行號.
當事務提交后,那些標記了刪除的記錄,以及UNDOLog中的記錄並不會馬上清除,這些記錄信息可以被其它事務所重用,
或是共享。只有當沒有任何事務共享這些記錄的時候,這些記錄才會被清除(purge)。這就是所謂purge操作。
而為了提高數據庫的操作效率,purge操作是由另外的線程異步完成。這就是為何前面你所看到的為何存在unpurged的事務的原因。
