Le moteur de tables MyISAM
<<<
Tables assemblées MERGE Tables HEAP
>>>

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 sont nouvelles depuis MySQL version 3.23.25. Le code est toujours en phase gamma, mais il est déjà raisonnablement stable.

Une table MERGE (aussi connue sous le nom de MRG_MyISAM , ou table assemblée) est un regroupement de tables MyISAM identiques, qui peuvent être utilisées ensemble, comme une seule. Nous ne pouvez faire que des commandes SELECT , DELETE et UPDATE dans ces tables. Si vous effacez (avec DROP ) la table MERGE , vous ne faîtes qu'annuler le rassemblement MERGE .

Notez que la commande DELETE FROM merge_table utilisée sans la clause WHERE va seulement effacer le rassemblement de tables, et non pas les lignes dans les tables. Nous envisageons de corriger cela en version 4.1.

Avec des tables identiques, nous voulons dire que toutes les tables sont créées avec les mêmes colonnes et index. Vous ne pouvez pas rassembler des tables dans lesquelles les colonnes sont définies différemment, n'ont pas exactement le même nombre de colonne, ou ont des index dans un autre ordre. Cependant, certaines des tables peuvent être compressées avec myisampack . myisampack , le générateur de tables MySQL compressées en lecture seule .

Lorsque vous créez une table MERGE , vous allez obtenir un fichier .frm , de définition de table, et un fichier de liste de tables .MRG . Le fichier .MRG contient simplement la liste des fichiers d'index (extension .MYI ) qui doivent être utilisés comme un seul et même. Toutes les tables utilisées doivent être dans la même base que la table MERGE elle-même.

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 .

Les tables MERGE peuvent vous aider dans les situations suivantes :

  • Gérer facilement un jeu de table de log. 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 fichiers en un seul. 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 .
  • REPLACE ne fonctionne pas.
  • 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 lente. 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 . Syntaxe de EXPLAIN (Obtenir des informations SELECT ) .
  • Vous ne pouvez pas faire de commande DROP TABLE , ALTER TABLE , DELETE FROM table_name sans clause WHERE , REPAIR TABLE , TRUNCATE TABLE , OPTIMIZE TABLE ou ANALYZE TABLE sur aucune des tables qui sont couvertes par une table MERGE qui est "ouverte". Si vous faîtes cela, la table MERGE peut toujours pointeur sur la table originale, et vous allez obtenir des résultats inattendus. Le plus simple palliatif est d'utiliser la commande FLUSH TABLES , pour s'assurer qu'aucune des tables MERGE ne reste ouverte.

Lorsque vous créez une table MERGE , vous devez spécifier la liste des tables que vous allez utiliser, avec l'option UNION(list-of-tables) . Optionellement, grâce à l'option INSERT_METHOD , vous pouvez spécifier si vous voulez que la table MERGE ajoute les nouvelles lignes dans la première ou la dernière table de l' UNION . Si vous spécifiez pas INSERT_METHOD ou si vous spécifiez NO , alors les commandes INSERT donnée à la table MERGE retourneront une erreur.

L'exemple suivant vous montre comme utiliser les tables MERGE :

CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
CREATE TABLE total (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20))
             TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Notez que vous pouvez aussi manipuler le fichier .MRG directement, hors du serveur MySQL :

shell> cd /mysql-data-directory/current-database
shell> ls -1 t1.MYI t2.MYI > total.MRG
shell> mysqladmin flush-tables
Maintenant, vous pouvez faire des commandes comme :

mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+
Notez que la colonne a , bien que déclarée PRIMARY KEY , n'est pas vraiment unique, car les tables MERGE ne peuvent pas garantir l'unicité entre les tables sous -jacente à la MyISAM .

Pour redéfinir une table MERGE , vous pouvez faire ceci :

  • DROP la table, puis recréez la.
  • Utilisez ALTER TABLE table_name UNION(...)
  • 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.

Sommaire :

<< Tables assemblées MERGE >>
Le moteur de tables MyISAM Types de tables MySQL Tables HEAP