Debido a que InnoDB es una base de datos con
multiversión, debe llevar información acerca de las versiones anteriores
de una fila en el espacio de tablas. Esta información se almacena en una
estructura de datos llamada Rollback Segment (Segmento de Cancelación) al
igual que una estructura de datos análoga de Oracle.
Internamente, InnoDB agrega dos campos a cada fila
almacenada en la base de datos. Un campo de 6 bytes indica el
identificador de la última transacción que insertó o actualizó la fila.
Además, una eliminación se trata internamente como una actualización en la
que un bit especial en la fila se establece a un valor que la señala como
eliminada. Cada registro también contiene un campo de 7 bytes llamado
"roll pointer" que apunta a una entrada del registro (log) de cancelación
de modificaciones (undo) grabado en el segmento de cancelación (RollBack
Segment). Si la fila fue actualizada, la entrada en el registro de
cancelación de modificaciones (undo log) contiene la información necesaria
para recrear el contenido de la fila tal como estaba antes de
actualizarse.
InnoDB utiliza la información en el segmento de
cancelación para deshacer los cambios durante la cancelación de una
transacción. También la emplea para generar versiones anteriores de una
fila en una lectura consistente.
Los registros de cancelación de modificaciones en el segmento de
cancelación se dividen entre originados por inserciones (insert undo logs)
y actualizaciones (update undo logs). Los insert undo logs se necesitan
solamente para la cancelación de transacciones y se descartan tan pronto
como se confirma la transacción. Los update undo logs se emplean también
para lecturas consistentes, y pueden descartarse solamente cuando no
quedan transacciones integrando una captura tomada por
InnoDB, que en una lectura consistente podría necesitar
esta información para reconstruir versiones anteriores de una fila.
Se deben confirmar las transacciones regularmente, incluyendo aquellas que
solamente realizan lecturas consistentes. De otro modo,
InnoDB no podrá descartar datos de los update undo
logs, y el segmento de cancelación puede crecer en demasía, llenando
el espacio de tablas.
El tamaño físico de una entrada en el registro de cancelación de cambios en el segmento de cancelación es generalmente menor que el de la correspondiente fila insertada o actualizada. Se puede emplear esta información para calcular el espacio necesario para el segmento de cancelación.
En el esquema de multiversión de InnoDB, una fila no es
quitada inmediatamente de la base de datos cuando se la elimina mediante
una sentencia SQL. Sólo cuando InnoDB pueda descartar
la entrada en el registro de cancelación de modificaciones creada para la
eliminación, procederá a quitar físicamente de la base de datos la fila y
sus entradas en los índices. Esta operación se llama depuración (purge) y
es bastante rápida, generalmente requiere el mismo tiempo que la sentencia
SQL que realizó la eliminación.
En un escenario donde el usuario inserte y elimine filas aproximadamente
en la misma proporción y en pequeños lotes, es posible que el subproceso
de depuración comience a sufrir retrasos y la tabla crezca contínuamente,
haciendo muy lenta cualquier operación que se realice sobre el disco.
Incluso si una tabla contuviera sólo 10 MB de datos útiles, puede crecer
hasta ocupar 10 GB con las filas “muertas”. En tal caso
podría ser bueno limitar las operaciones de filas nuevas y asignar más
recursos al subproceso de depuración. La opción de inicio (y también
variable global configurable) innodb_max_purge_lag
existe precisamente para este propósito. Consulte Sección 15.4, “Opciones de arranque de InnoDB” para más información.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.
