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
. See Section 8.2, « myisampack
, le générateur de tables MySQL
compressées en lecture seule ».
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
:
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;
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> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
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 :
shell>cd /mysql-data-directory/current-database
shell>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 Section 7.2.1, « Syntaxe de EXPLAIN
(Obtenir des informations sur les
SELECT
) » pour plus d'informations sur
eq_ref
et ref
.
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.