DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info) innodb-multi-versioning

Info Catalog (mysql.info) innodb-tuning (mysql.info) innodb (mysql.info) table-and-index
 
 14.2.12 Implementation of Multi-Versioning
 ------------------------------------------
 
 Because `InnoDB' is a multi-versioned storage engine, it must keep
 information about old versions of rows in the tablespace. This
 information is stored in a data structure called a rollback segment
 (after an analogous data structure in Oracle).
 
 Internally, `InnoDB' adds two fields to each row stored in the
 database. A 6-byte field indicates the transaction identifier for the
 last transaction that inserted or updated the row. Also, a deletion is
 treated internally as an update where a special bit in the row is set
 to mark it as deleted. Each row also contains a 7-byte field called the
 roll pointer. The roll pointer points to an undo log record written to
 the rollback segment. If the row was updated, the undo log record
 contains the information necessary to rebuild the content of the row
 before it was updated.
 
 `InnoDB' uses the information in the rollback segment to perform the
 undo operations needed in a transaction rollback. It also uses the
 information to build earlier versions of a row for a consistent read.
 
 Undo logs in the rollback segment are divided into insert and update
 undo logs. Insert undo logs are needed only in transaction rollback and
 can be discarded as soon as the transaction commits.  Update undo logs
 are used also in consistent reads, but they can be discarded only after
 there is no transaction present for which `InnoDB' has assigned a
 snapshot that in a consistent read could need the information in the
 update undo log to build an earlier version of a database row.
 
 You must remember to commit your transactions regularly, including
 those transactions that issue only consistent reads. Otherwise,
 `InnoDB' cannot discard data from the update undo logs, and the
 rollback segment may grow too big, filling up your tablespace.
 
 The physical size of an undo log record in the rollback segment is
 typically smaller than the corresponding inserted or updated row.  You
 can use this information to calculate the space need for your rollback
 segment.
 
 In the `InnoDB' multi-versioning scheme, a row is not physically
 removed from the database immediately when you delete it with an SQL
 statement. Only when `InnoDB' can discard the update undo log record
 written for the deletion can it also physically remove the
 corresponding row and its index records from the database. This removal
 operation is called a purge, and it is quite fast, usually taking the
 same order of time as the SQL statement that did the deletion.
 
 In a scenario where the user inserts and deletes rows in smallish
 batches at about the same rate in the table, it is possible that the
 purge thread starts to lag behind, and the table grows bigger and
 bigger, making everything disk-bound and very slow. Even if the table
 carries just 10MB of useful data, it may grow to occupy 10GB with all
 the `dead' rows. In such a case, it would be good to throttle new row
 operations, and allocate more resources to the purge thread. The
 `innodb_max_purge_lag' system variable exists for exactly this purpose.
 See  innodb-parameters, for more information.
 
Info Catalog (mysql.info) innodb-tuning (mysql.info) innodb (mysql.info) table-and-index
automatically generated byinfo2html