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.