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-databaseshell> 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:
-
DROPla tablaMERGEy recrearla. -
Use
ALTER TABLEtbl_nameUNION=(...) para cambiar la lista de tablas subyacentes. -
Cambie el fichero
.MRGy realice un comandoFLUSH TABLEpara la tablaMERGEy 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
MERGEpara 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
MERGEpuede 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
MERGEpara las otras. Puede tener distintas tablasMERGEque usen conjuntos no disjuntos de tablas. -
Realizar reparaciones más eficientes. Es más fácil de reparar tablas individuales mapeadas en una tabla
MERGEque reparar una única tabla grande. -
Mapear instantáneamente varias tablas como una. Una tabla
MERGEno necesita mantener un índice propio ya que usa los índices de las tablas individuales. Como resultado, las colecciones de tablasMERGEson 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
MERGEsobre 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
MyISAMestá ligada a este límite, pero una colección de tablasMyISAMno lo está. -
Puede crear un alias o sinónimo para una tabla
MyISAMdefiniendo una tablaMERGEque 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
MyISAMidénticas para una tablaMERGE. -
No puede usar un número de características
MyISAMen tablasMERGE. Por ejemplo, no puede crear índicesFULLTEXTen tablasMERGE. (Puede crear índicesFULLTEXTen las tablasMyISAMsubyacentes, puero no puede buscar en la tablaMERGEcon búsquedas full-text.) -
Si la tabla
MERGEno es temporal, todas las tablas subyacentesMyISAMdeben ser permanentes. Si la tablaMERGEes temporal, las tablasMyISAMpueden ser cualquier mezcla de tablas temporales y no temporales. -
Las tablas
MERGEusan más descriptores de fichero. Si 10 clientes usan una tablaMERGEque 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
MERGEnecesita leer en todas las tablas subyacentes para chequear cuál se parece más a la clave dada. Si luego lee el siguiente, el motorMERGEnecesita 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 clavesMERGEsean 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_refyref.
A continuación se describen problemas conocidos con tablas
MERGE:
-
Si usa
ALTER TABLEpara cambiar una tablaMERGEa otro tipo de tabla, el mapeo de las tablas subyacentes se pierde. En su lugar, los registros de las tablas subyacentesMyISAMse copian en la tabla alterada, que luego se asigna al nuevo tipo. -
REPLACEno funciona. -
No puede usar
DROP TABLE,ALTER TABLE,DELETE FROMsin una cláusulaWHERE,REPAIR TABLE,TRUNCATE TABLE,OPTIMIZE TABLE, oANALYZE TABLEen alguna de las tablas que se mapean en una tablaMERGEabierta. Si lo hace, la tablaMERGEpuede referirse a la tabla original, lo que conduce a resultados inesperados. La forma más fácil de solucionar esto es realizar un comandoFLUSH TABLESantes de realizar ninguna de estas operaciones para segurar que no quedan abiertas tablasMERGE. -
Una tabla
MERGEno puede mantener restriccionesUNIQUEsobre 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 tablaMERGEde tablasMyISAMdisimilares, es muy posible que tenga problemas extraños. -
El orden de índices en la tabla
MERGEy sus tablas subyacentes debe ser el mismo. Si usaALTER TABLEpara añadir un índiceUNIQUEa una tabla usada en una tablaMERGE, y después usaALTER TABLEpara 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 TABLEpone los índicesUNIQUEantes 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 TABLEen una tabla en uso por una tablaMERGEno funciona en Windows ya que el mapeo del motor de almacenamientoMERGEestá 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 tablaMERGEantes de borrar la tabla.