| 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
  :
 BerkeleyDB
  est un synonyme de  
BDB
  pour les options  
ENGINE
  et
 
TYPE
 .| 
CREATE TABLE t (i INT) ENGINE = BDB;CREATE TABLE t (i INT) TYPE = BDB;
 | 
 
Le moteur de tables  
BDB
  fournit un modèle transactionnel. La façon
dont vous utilisez ces tables dépend du mode de validation : 
 
Syntaxe des 
BEGIN/COMMIT/ROLLBACK
 .
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. 
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. |