15.4 Tables BDB ou BerkeleyDB
15 Types de tables MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Systèmes d'exploitation supportés par BDB . Installation de BDB . Options de démarrage BDB ->Caractéristiques des tables BDB . Ce que nous devons corriger dans BDB dans un futur proche : . Restrictions avec les tables BDB . Erreurs pouvant survenir lors de l'utilisation des tables BDB
|
15.4.4 Caractéristiques des tables BDB 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.
Syntaxe des
BEGIN/COMMIT/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 table
MyISAM
, 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
.
Syntaxe de
ANALYZE TABLE
. 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. 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.
|