El motor de almacenamiento MERGE
, también
conocido como MRG_MyISAM
, es una colección de
tablas MyISAM
idénticas que pueden usarse como
una. "Idéntica"significa que todas lsas tablas tienen
información de columna e índice idéntica. No puede mezclar
tablas en que las columnas se listen en orden distinto, no tengan
exactamente las mismas columnas, o tengan los índices en orden
distinto. Sin embargo, alguna o todas las tablas pueden
comprimirse con myisampack. Consulte
Sección 8.2, “myisampack, el generador de tablas comprimidas de sólo lectura de MySQL”. Diferencias en las opciones de las
tablas tales como AVG_ROW_LENGTH
,
MAX_ROWS
, o PACK_KEYS
no
importan.
Cuando crea una tabla MERGE
, MySQL crea dos
ficheros en disco. Los ficheros tienen nombres que comienzan con
el nombre de la tabla y tienen una extensión para indicar el tipo
de fichero, Un fichero .frm
almacena la
definición de tabla , y un fichero .MRG
contiene los nombres de las tablas que deben usarse como una. Las
tablas no tienen que estar en la misma base de datos que la tabla
MERGE
misma.
Puede usar SELECT
, DELETE
,
UPDATE
, y INSERT
en la
colección de tablas, Debe tener permisos de
SELECT
, UPDATE
, y
DELETE
en las tablas que mapea a una tabla
MERGE
.
Si hace un DROP
de la tabla
MERGE
, sólo borra la especificación
MERGE
. Las tablas subyacentes no se ven
afectadas.
Cuando crea una tabla MERGE
, debe especificar
una cláusula
UNION=(
list-of-tables
)
que indica qué tablas quiere usar como una. Puede especificar
opcionalmente una opción INSERT_METHOD
si
quiere que las inserciones en la tabla MERGE
se
realicen en la primera o última tabla de la lista
UNION
. Use un valor de
FIRST
o LAST
para hacer que
las inserciones se hagan en la primera o última tabla,
respectivamente. Si no especifica una opción
INSERT_METHOD
o si la especifica con un valor
de NO
, intentos de insertar registros en la
tabla MERGE
producen un error.
El siguiente ejemplo muestra cómo crear una tabla
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;
Tenga en cuenta que la columna a
está indexada
en la tabla MERGE
, pero no está declarada
como PRIMARY KEY
como lo está en las tablas
MyISAM
subyacente. Esto es necesario ya que una
tabla MERGE
no puede forzar unicidad en un
conjunto de tablas subyacentes.
Tras crear la tabla MERGE
, puede realizar
consultas que operen en el grupo de tablas como unidad:
mysql> SELECT * FROM total; +---+---------+ | a | message | +---+---------+ | 1 | Testing | | 2 | table | | 3 | t1 | | 1 | Testing | | 2 | table | | 3 | t2 | +---+---------+
Tenga en cuenta que puede manipular el fichero
.MRG
directamente desde fuera del servidor
MySQL :
shell> cd /mysql-data-directory
/current-database
shell> ls -1 t1 t2 > total.MRG shell> mysqladmin flush-tables
Para rempaear una tabla MERGE
a una colección
diferente de tablas MyISAM
, puede realizar una
de las siguientes opciones:
-
DROP
la tablaMERGE
y recrearla. -
Use
ALTER TABLE
tbl_name
UNION=(...) para cambiar la lista de tablas subyacentes. -
Cambie el fichero
.MRG
y realice un comandoFLUSH TABLE
para la tablaMERGE
y todas las tablas subyacentes para forzar al motor de almacenamiento a leer el nuevo fichero de definición.
Las tablas MERGE
pueden ayudarle a arreglar los
siguientes problemas:
-
Administrar fácilmente un largo conjunto de tablas. Por ejemplo, puede poner datos de meses distintos en tablas separadas, comprimir algunos de ellos con myisampack, y luego crear una tabla
MERGE
para usarlas como una. -
Obtener más velocidad. Puede dividir una tabla grande de sólo lectura basándose en algún criterio, y luego poner las tablas individuales en distintos discos. Una tabla
MERGE
puede ser mucho más rápida que usar una tabla grande. -
Realizar búsquedas más eficientes. Si conoce exactamente lo que busca, puede buscar en sólo una de las tablas divididas y usar una tabla
MERGE
para las otras. Puede tener distintas tablasMERGE
que usen conjuntos no disjuntos de tablas. -
Realizar reparaciones más eficientes. Es más fácil de reparar tablas individuales mapeadas en una tabla
MERGE
que reparar una única tabla grande. -
Mapear instantáneamente varias tablas como una. Una tabla
MERGE
no necesita mantener un índice propio ya que usa los índices de las tablas individuales. Como resultado, las colecciones de tablasMERGE
son muy rápidas de crear o remapear. (Tenga en cuenta que debe especificar las definiciones de índices cuando crea una tablaMERGE
, incluso cuando no se crean índices.) -
Si tiene un conjunto de tablas que une como una tabla grande bajo demanda o batch, debe crear una tabla
MERGE
sobre ellas bajo demanda. Esto es mucho más rápido y ahorra mucho espacio de disco. -
Excede el límite de tamaño del sistema operativo. Cada tabla
MyISAM
está ligada a este límite, pero una colección de tablasMyISAM
no lo está. -
Puede crear un alias o sinónimo para una tabla
MyISAM
definiendo una tablaMERGE
que mapee a una tabla. No debería haber un impacto de rendimiento realmente impactante al hacer esto (sólo un par de llamadas indirectas y llamadasmemcpy()
para cada lectura).
Las desventajas de las tablas MERGE
son:
-
Sólo puede usar tablas
MyISAM
idénticas para una tablaMERGE
. -
No puede usar un número de características
MyISAM
en tablasMERGE
. Por ejemplo, no puede crear índicesFULLTEXT
en tablasMERGE
. (Puede crear índicesFULLTEXT
en las tablasMyISAM
subyacentes, puero no puede buscar en la tablaMERGE
con búsquedas full-text.) -
Si la tabla
MERGE
no es temporal, todas las tablas subyacentesMyISAM
deben ser permanentes. Si la tablaMERGE
es temporal, las tablasMyISAM
pueden ser cualquier mezcla de tablas temporales y no temporales. -
Las tablas
MERGE
usan más descriptores de fichero. Si 10 clientes usan una tablaMERGE
que mapee a 10 tablas, el servidor usa (10*10) + 10 descriptores de fichero. (10 descriptores de ficheros de datos para cada uno de los 10 clientes, y 10 descriptores de ficheros de índice compartidos entre los clients.) -
Las lecturas de claves son más lentas. Cuando lee una clave, el motor de almacenamiento
MERGE
necesita leer en todas las tablas subyacentes para chequear cuál se parece más a la clave dada. Si luego lee el siguiente, el motorMERGE
necesita buscar en los buffers de lectura para buscar la siguiente clave. Sólo cuando se usa un búffer de claves el motor necesita leer el siguiente bloque de claves. Esto hace que las clavesMERGE
sean mucho más lentas en búsquedaseq_ref
, pero no mucho más lentas en búsquedasref
. Consulte Sección 7.2.1, “Sintaxis deEXPLAIN
(Obtener información acerca de unSELECT
)” para más información sobreeq_ref
yref
.
A continuación se describen problemas conocidos con tablas
MERGE
:
-
Si usa
ALTER TABLE
para cambiar una tablaMERGE
a otro tipo de tabla, el mapeo de las tablas subyacentes se pierde. En su lugar, los registros de las tablas subyacentesMyISAM
se copian en la tabla alterada, que luego se asigna al nuevo tipo. -
REPLACE
no funciona. -
No puede usar
DROP TABLE
,ALTER TABLE
,DELETE FROM
sin una cláusulaWHERE
,REPAIR TABLE
,TRUNCATE TABLE
,OPTIMIZE TABLE
, oANALYZE TABLE
en alguna de las tablas que se mapean en una tablaMERGE
abierta. Si lo hace, la tablaMERGE
puede referirse a la tabla original, lo que conduce a resultados inesperados. La forma más fácil de solucionar esto es realizar un comandoFLUSH TABLES
antes de realizar ninguna de estas operaciones para segurar que no quedan abiertas tablasMERGE
. -
Una tabla
MERGE
no puede mantener restriccionesUNIQUE
sobre la tabla entera. Cuando realiza unINSERT
, los datos van a la primera o última tablaMyISAM
(dependiendo del valor de la opciónINSERT_METHOD
). MySQL se asegura que los valores de clave única sean únicos dentro de la tablaMyISAM
, pero no entre todas las tablas en la colección. -
Cuando crea una tabla
MERGE
, no se chequea que las tablas subyacentes existan y tengan una estructura idéntica. Cuando se usa la tablaMERGE
, MySQL chequea que la longitud del registro para todas las tablas mapeadas sea la misma, pero esto no es "a prueba de bombas". Si crea una tablaMERGE
de tablasMyISAM
disimilares, es muy posible que tenga problemas extraños. -
El orden de índices en la tabla
MERGE
y sus tablas subyacentes debe ser el mismo. Si usaALTER TABLE
para añadir un índiceUNIQUE
a una tabla usada en una tablaMERGE
, y después usaALTER TABLE
para añadir un índice no único en la tablaMERGE
, la ordenación de índice es distinta para las tablas si ya hay un índice no único en las tabla subyacentees. (Esto es porqueALTER TABLE
pone los índicesUNIQUE
antes de los índices no únicos para facilitar detección rápida de claves duplicadas.) Consecuentemente, las consultas en tablas con tales índices pueden retornar resultados no esperados. -
DROP TABLE
en una tabla en uso por una tablaMERGE
no funciona en Windows ya que el mapeo del motor de almacenamientoMERGE
está escondido por la capa superior de MySQL. Desde Windows no se permite el borrado de ficheros abiertos, debe volcar todas las tablasMERGE
(conFLUSH TABLES
) o borrar la tablaMERGE
antes de borrar la tabla.