Chaque table BDB est stocké sur le disque en
deux fichiers. Les fichiers portent le nom de la table, et ont
des extensions qui indiquent le type de fichier. Un fichier
.frm stocke la définition de la table, et
le fichier .db contient les données et les
index.
Pour spécifier explicitement que vous voulez une table
BDB, indiquez l'option de création de table
ENGINE ou TYPE :
CREATE TABLE t (i INT) ENGINE = BDB; CREATE TABLE t (i INT) TYPE = BDB;
BerkeleyDB est un synonyme de
BDB pour les options
ENGINE et TYPE.
Le moteur de tables BDB fournit un modèle
transactionnel. La fa¸on dont vous utilisez ces tables dépend
du mode de validation :
Si vous utilisez le mot d'auto-validation (ce qui est le
mode par défaut), les modifications dans les tables
BDB sont validées immédiatement, et ne
peuvent pas être annulées.
Si vous utilisez le mode de validation manuel, les
modifications ne seront rendues permanentes que si vous
envoyez la commande COMMIT. AU lieu de
valider, vous pouvez aussi annuler avec la commande
ROLLBACK pour détruire les
modifications.
Vous pouvez démarrer une transaction avec la commande
BEGIN WORK pour suspendre le mode
d'auto-validation, ou avec SET
AUTOCOMMIT=0 pour le désactiver explicitement.
See Section 13.4.1, « Syntaxes de START TRANSACTION,
COMMIT et ROLLBACK ».
Le moteur de tables BDB a les
caractéristiques suivantes :
Les tables BDB peuvent avoir jusqu'à 31
index par table, 16 colonnes par index, et un taille
maximale de 1024 octets par index (500 octets avant MySQL
4.0).
MySQL requiert une clé PRIMARY KEY dans
chaque table BDB pour être capable de
faire référence aux lignes précédemment lues. Si vous
n'en créez pas, MySQL va gérer une telle clé de manière
cachée. La clé cachée a une taille de 5 octets, et est
incrémentée à chaque nouvelle insertion.
La clé PRIMARY KEY sera plus rapide que
n'importe quelle autre clé, car la PRIMARY
KEY est stockée avec les données. Comme les
autres clés sont stockées sous la forme données +
PRIMARY KEY, il est important de garder
une clé PRIMARY KEY aussi courte que
possible pour économiser de l'espace disque, et améliorer
la vitesse.
Ce comportement est similaire à celui
d'InnoDB, où des clés primaires courtes
économisent de l'espace pour la clé primaire et pour les
index secondaire aussi.
Si toutes les colonnes auxquelles vous accédez dans une
table BDB font partie du même index dans
la clé primaire, alors MySQL peut exécuter la requête
sans avoir à lire la ligne elle-même. Dans une
tableMyISAM, ce qui précède n'est
valable que si les colonnes font partie du même index.
Scanner séquentiellement est plus lent qu'avec
MyISAM car les tables
BDB stockent les données dans un fichier
B-tree et non pas dans un fichier
séparé.
Les clés ne sont pas compressées avec les clés
précédentes, comme pour les tables ISAM
et MyISAM. En d'autres termes, les
informations de clés prennent un peu plus d'espace pour les
tables BDB, comparativement aux tables
MyISAM qui n'utilisent pas l'option
PACK_KEYS=0.
Il y a souvent des trous dans les tables
BDB pour vous permettre d'insérer de
nouvelles lignes au milieu de l'arbre de données. Cela rend
les tables BDB un peu plus grandes que
les tables MyISAM.
SELECT COUNT(*) FROM table_name est très
lent, car les tables BDB ne maintiennent
pas un compte de leur lignes dans la table.
L'optimiseur a besoin de connaître une approximation du
nombre de lignes dans la table. MySQL résout ce problème
en comptant les insertions et en conservant ce compte dans
un segment séparé pour chaque table
BDB. Si vous ne faites pas souvent de
DELETE ou ROLLBACK, ce
nombre sera plutôt précis pour l'optimiseur MySQL, mais
comme MySQL ne stocke ce nombre qu'à la fermeture de la
table, il peut être incorrecte si MySQL s'interrompt
inopinément. Cela ne doit pas être fatal si ce nombre
n'est pas à 100% correct. Vous pouvez forcer la mise à
jour de ce nombre avec la commande ANALYZE
TABLE ou OPTIMIZE TABLE.
Section 13.5.2.1, « Syntaxe de ANALYZE TABLE » .
Section 13.5.2.5, « Syntaxe de OPTIMIZE TABLE ».
Le verrouillage interne des tables BDB
est fait au niveau page.
LOCK TABLES fonctionne avec les tables
BDB sur les autres tables. Si vous
n'utilisez pas le verrou LOCK TABLE,
MySQL va poser un verrou interne multiple sur la table, pour
s'assurer que la table est bien verrouillée, si un autre
thread tente de poser un verrou.
Pour permettre les annulations de transaction,
BDB gère un fichier de log. Pour
maximiser les performances, vous devriez placer ces fichiers
sur un autre disque que celui de votre base, en utilisant
l'option --bdb-logdir.
MySQL fait un point de contrôle à chaque fois qu'un
nouveau fichier de log BDB est démarré,
et supprime les fichiers de logs anciens qui ne sont pas
utiles. Si vous exécutez la commande FLUSH
LOGS, vous placerez un nouveau point de contrôle
pour les tables Berkeley DB.
Pour la restauration après crash, vous devez utiliser les sauvegardes et le log binaire de MySQL. See Section 5.7.1, « Sauvegardes de base de données ».
Attention : si vous
effacez les anciens fichiers de log qui sont en cours
d'utilisation, BDB ne sera pas capable de
faire la restauration et vous risquez de perdre des
données.
L'application doit toujours être prête à gérer des cas
où une modification sur une table BDB
peut être annulée, ou une lecture abandonnée pour cause
de blocage de verrous.
Si vous atteignez la capacité maximale du disque avec la
table BDB, vous allez obtenir une erreur
(probablement l'erreur 28), et la transaction va s'annuler.
C'est un comportement différent des tables
MyISAM et ISAM qui
vont attendre que mysqld ait trouvé de
l'espace disque avant de continuer.
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.
