| 15 Types de tables MySQL
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Le moteur de tables MyISAM
 ->Tables assemblées MERGE
 . Tables HEAP
 . Tables BDB ou BerkeleyDB
 . Tables ISAM
 
 
 | 
  15.2 Tables assemblées MERGE    
   Les tables  
MERGE
  ont été ajoutée en MySQL version 3.23.25. 
Ce type de table est aussi connu sous le nom de  
MRG_MyISAM
 . Le code
raisonnablement stable. 
Une table  
MERGE
  est un groupe de tables  
MyISAM
  identiques qui
sont utilisées comme une seule. ``Identique'' signifie que toutes les tables
ont la même structure de colonnes et d'index. Vous ne pouvez pas regrouper des
tables qui ont des index dans un ordre différent. Toutefois, une ou plusieurs
tables peuvent être compressées avec  
myisampack
 .
 
myisampack
, le générateur de tables MySQL compressées .
Lorsque vous créez une table  
MERGE
 , MySQL crée deux fichiers sur le disque.
Les fichiers ont pour nom celui de la table, et ont un extension qui indique
le type de fichiers. Le fichier  
.frm
  stocke la définition de la table, et 
le fichier  
.MRG
  contient les noms des tables qui doivent être utilisées.
Originalement, toutes les tables utilisées dans la même table
 
MERGE
  devaient être dans la même base que la table  
MERGE
  . Cette restriction
a été levée en MySQL 4.1.1. 
Pour le moment, vous avez simplement besoin des droits de 
 
SELECT
 ,  
UPDATE
  et  
DELETE
  sur les tables que 
vous avez rassemblé dans la table  
MERGE
 .
L'exemple suivant vous montre comme utiliser les tables  
MERGE
  : Notez que la colonne  
a
  est indexée dans la table  
MERGE
 , mais elle
n'est pas déclarée comme  
PRIMARY KEY
  comme elle peut l'être dans les
tables  
MyISAM
  sous-jacente. C'est nécessaire car une table 
 
MERGE
  ne peut pas assurer l'unicité de valeurs à travers les tables.Après la création de la table  
MERGE
 , vous pouvez faire des commandes comme :| 
mysql> CREATE TABLE t1 (->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 ->    message CHAR(20));
 mysql> CREATE TABLE t2 (
 ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 ->    message CHAR(20));
 mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
 mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
 mysql> CREATE TABLE total (
 ->    a INT NOT NULL AUTO_INCREMENT,
 ->    message CHAR(20), INDEX(a))
 ->    TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
 | 
 Pour redéfinir une table  
MERGE
  avec un autre groupe de tables
 
MyISAM
 , vous pouvez faire ceci : Notez que vous pouvez aussi manipuler le fichier  
.MRG
  directement, 
à l'extérieur du serveur MySQL :| 
mysql> SELECT * FROM total;+---+---------+
 | a | message |
 +---+---------+
 | 1 | Testing |
 | 2 | table   |
 | 3 | t1      |
 | 1 | Testing |
 | 2 | table   |
 | 3 | t2      |
 +---+---------+
 | 
 | 
shell> cd /mysql-data-directory/current-databaseshell> ls -1 t1 t2 > total.MRG
 shell> mysqladmin flush-tables
 | 
 
Effacez la table avec la commande  
DROP
 , puis recréez la.
Utilisez  
ALTER TABLE tbl_name UNION=(...)
  pour redéfinir les tables
regroupées.
Modifiez le fichier  
.MRG
  et utilisez la commande  
FLUSH TABLE
  sur
la table  
MERGE
  et toutes les tables sous-jacentes, pour forcer  
le gestionnaire à relire la définition. 
Les tables  
MERGE
  peuvent vous aider dans les situations suivantes : 
 
Gérer facilement un jeu de tables d'historique. Par exemple, vous pourriez
placer les données de chaque mois dans un fichier séparé, en compresser
certains avec  
myisampack
  puis créer une table  
MERGE
  pour les utiliser.
Vous donner plus de vitesse. Vous pouvez répartir les grandes tables en lecture
seule dans différentes parties du disque. Une table  
MERGE
  bâtie de cette
façon peut être plus rapide qu'une grosse table (vous pouvez aussi et bien sûr,
utiliser un système RAID pour arriver aux mêmes avantages).
Effectuer des recherches plus efficaces. Si vous savez exactement ce que vous
recherchez, vous pouvez faire des recherches dans une seule des tables
individuelles pour les recherches, et utiliser la table  
MERGE
  pour les
autres opérations. Vous pouvez même avoir de nombreuses tables
 
MERGE
  actives, qui partagent les même fichiers.
Des réparations plus efficaces. Il est plus facile de réparer les fichiers
individuels qui sont rassemblés dans une table  
MERGE
  que de réparer une
grande table.
Fusion instantanée de plusieurs tables en une seule. Une table  
MERGE
  
utilise les index des tables individuelles. Il n'y a pas besoin de gérer un
seul index. Cela rend les tables  
MERGE
 
très
  
rapides à faire ou défaire. Notez que vous devez spécifier 
les définitions de clés lorsque vous créez la table  
MERGE
 !
Si vous avez un jeu de table que vous rassemblez dans une grande
à la demande ou pour un traitement batch, vous devriez utiliser une table
 
MERGE
 . C'est bien plus rapide, et cela va vous faire économiser de l'espace
disque.
Contourner les limitations de taille du système d'exploitation.
Vous pouvez créer un alias ou un synonyme pour une table, en utilisant
simplement  
MERGE
  sur une seule. Il n'y a pas de coûts particulier
en performance (hormis quelques appels de fonctions indirects, et des
 
memcpy()
  avant chaque lecture). 
Les inconvénients des tables de type  
MERGE
  sont :
 
Vous devez utiliser des tables  
MyISAM
  identiques pour faire une table  
MERGE
 .
MERGE
  utilise plus de pointeurs de fichiers. Si vous utilisez
une table  
MERGE
  qui couvre 10 tables et que 10 utilisateurs l'utilisent,
vous consommez 10*10 + 10 pointeurs de fichiers (10 fichiers de données, et
10 utilisateurs avec 10 fichiers d'index).
Les lectures de clés sont plus lentes. Lorsque vous faîtes une lecture sur
une clé, le gestionnaire  
MERGE
  doit faire une lecture dans tous les
fichiers d'index des tables sous-jacentes, pour vérifier lequel est le plus
proche de la valeur recherchée. Si vous faîtes une lecture du type
"lit le suivant", le gestionnaire de table assemblée doit rechercher dans tous
les buffers de clés pour la trouver. Uniquement lorsqu'un buffer clé est complet,
doit il lire le prochain bloc. Cela rend l'accès aux clés  
MERGE
  bien plus
lent que les recherches  
eq_ref
 , mais pas aussi lent que les recherches de type
 
ref
 .
Voyez la section  Syntaxe de 
EXPLAIN
 (Obtenir des informations 
SELECT
)  pour plus d'informations sur 
 
eq_ref
  et  
ref
 . Sommaire : |