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 :
|