DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info.gz) InnoDB Multi-Versioning

Info Catalog (mysql.info.gz) InnoDB tuning (mysql.info.gz) InnoDB (mysql.info.gz) Table and index
 
 15.13 Implementation of Multi-Versioning
 ========================================
 
 Because `InnoDB' is a multi-versioned database, 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, and 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 only issue 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 will start to lag behind, and the table grows bigger and
 bigger, making everything disk-bound and very slow.  Even if the table
 would carry just 10 MB of useful data, it may grow to occupy 10 GB with
 all the dead rows.  In such a case, it would be good to throttle new
 row operations, and allocate more resources for the purge thread.
 
 The InnoDB transaction system maintains a list of transactions that
 have delete-marked index records by `UPDATE' or `DELETE' operations.
 Let the length of this list be PURGE_LAG.
 
 Starting with MySQL/InnoDB-4.1.6 and 4.0.22, there is a startup option
 and settable global variable `innodb_max_purge_lag', which is zero by
 default.  When this parameter is non-zero, InnoDB may delay new row
 operations.  When the PURGE_LAG exceeds `innodb_max_purge_lag', each
 `INSERT', `UPDATE' and `DELETE' operation will be delayed by
 PURGE_LAG/`innodb_max_purge_lag'*10-5 milliseconds.  The delay is
 computed in the beginning of a purge batch, every ten seconds.  The
 operations will not be delayed if purge cannot run because of an old
 consistent read view that could see the rows to be purged.  A typical
 setting for a problematic workload might be 1 million, assuming that
 our transactions are small, only 100 bytes in size, and we can allow
 100 MB of unpurged rows in our tables.
 
Info Catalog (mysql.info.gz) InnoDB tuning (mysql.info.gz) InnoDB (mysql.info.gz) Table and index
automatically generated byinfo2html