Comme InnoDB
est une base de donnes
multi-versionnée, elle doit conserver des informations des
vieilles versions des lignes dans l'espace de tables. Cette
information est stockée dans la structure de données que nous
appelons un segment d'annulation, d'après la structure similaire
d'Oracle.
En interne, InnoDB
ajoute deux champs à chaque
ligne stockée dans la base. Un champ de 6 octets note
l'identifiant de la dernière transaction qui a inséré ou
modifier la ligne. De plus, un effacement est traité en interne
comme une modification, où un bit spécial dans la ligne sert à
marquer la ligne comme effacée. Chaque ligne contient aussi une
colonne de 7 octets appelé un pointeur d'annulation. Ce pointeur
fait référence à une ligne dans un fichier d'annulation qui
contient les informations nécessaires pour reconstruire le
contenu de la ligne qui a été modifiée.
InnoDB
utilise les informations dans le segment
d'annulation pour effectuer les opérations d'annulation
nécessaires dans une annulation de transaction. Il utilise aussi
ces informations pour reconstruire les anciennes versions d'une
ligne lors d'une lecture cohérente.
Le log d'annulation dans le segment d'annulation est divisé entre les insertions et les modifications. Le log d'insertion n'est nécessaire que lors des annulations de transactions, et peut être vidé dès que la requête est validée. Le log de modification est utilisé lors des lectures cohérentes, et les informations y sont supprimées une fois que toutes les transactions qui font une lecture cohérente sont terminées.
Vous devez vous rappeler que valider vos transactions
régulièrement, même ces transactions qui ne font que des
lectures cohérentes. Sinon, InnoDB
ne peut pas
vider le log de modification, et le segment d'annulation va
grossir énormément.
La taille physique d'une ligne du log d'annulation dans le segment d'annulation est typiquement plus petite que la ligne correspondante insérée ou modifiée. Vous pouvez utiliser ces informations pour calculer l'espace nécessaire à vos segments d'annulation.
Dans nos schémas de multi-versionnage, une ligne n'est pas
physiquement supprimée de la table immédiatement lorsque vous
l'effacez avec une requête SQL. Uniquement lorsque
InnoDB
va supprimer les lignes du log de
modification, il vaut aussi supprimer physiquement la ligne, et
les index. Cette opération d'effacement est appelée une purge,
et elle est plutôt rapide, et aussi rapide que la requête SQL
elle-même.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.