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=(
que indica qué tablas quiere usar como una. Puede especificar
opcionalmente una opción list-of-tables)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:
DROP la tabla MERGE y
recrearla.
Use ALTER TABLE para cambiar la lista de tablas
subyacentes.
tbl_name
UNION=(...)
Cambie el fichero .MRG y realice un
comando FLUSH TABLE para la tabla
MERGE 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 tablas MERGE 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 tablas
MERGE son muy rápidas
de crear o remapear. (Tenga en cuenta que debe especificar las
definiciones de índices cuando crea una tabla
MERGE , 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 tablas MyISAM no lo
está.
Puede crear un alias o sinónimo para una tabla
MyISAM definiendo una tabla
MERGE 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 llamadas
memcpy() para cada lectura).
Las desventajas de las tablas MERGE son:
Sólo puede usar tablas MyISAM idénticas
para una tabla MERGE .
No puede usar un número de características
MyISAM en tablas MERGE .
Por ejemplo, no puede crear índices
FULLTEXT en tablas MERGE
. (Puede crear índices FULLTEXT en las
tablas MyISAM subyacentes, puero no puede
buscar en la tabla MERGE con búsquedas
full-text.)
Si la tabla MERGE no es temporal, todas las
tablas subyacentes MyISAM deben ser
permanentes. Si la tabla MERGE es temporal,
las tablas MyISAM pueden ser cualquier
mezcla de tablas temporales y no temporales.
Las tablas MERGE usan más descriptores de
fichero. Si 10 clientes usan una tabla
MERGE 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
motor MERGE 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 claves
MERGE sean mucho más lentas en búsquedas
eq_ref , pero no mucho más lentas en
búsquedas ref . Consulte
Sección 7.2.1, “Sintaxis de EXPLAIN (Obtener información acerca de
un SELECT)” para más información sobre
eq_ref y ref.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.
