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