14.2. El motor de almacenamiento MERGE

MySQL 5.0

14.2. El motor de almacenamiento MERGE

El motor de almacenamiento , también conocido como , es una colección de tablas 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 , , o no importan.

Cuando crea una tabla , 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 almacena la definición de tabla , y un fichero 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 misma.

Puede usar , , , y en la colección de tablas, Debe tener permisos de , , y en las tablas que mapea a una tabla .

Si hace un de la tabla , sólo borra la especificación . Las tablas subyacentes no se ven afectadas.

Cuando crea una tabla , debe especificar una cláusula ) que indica qué tablas quiere usar como una. Puede especificar opcionalmente una opción si quiere que las inserciones en la tabla se realicen en la primera o última tabla de la lista . Use un valor de o para hacer que las inserciones se hagan en la primera o última tabla, respectivamente. Si no especifica una opción o si la especifica con un valor de , intentos de insertar registros en la tabla producen un error.

El siguiente ejemplo muestra cómo crear una tabla :

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 está indexada en la tabla , pero no está declarada como como lo está en las tablas subyacente. Esto es necesario ya que una tabla no puede forzar unicidad en un conjunto de tablas subyacentes.

Tras crear la tabla , 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 directamente desde fuera del servidor MySQL :

shell> cd //
shell> ls -1 t1 t2 > total.MRG
shell> mysqladmin flush-tables

Para rempaear una tabla a una colección diferente de tablas , puede realizar una de las siguientes opciones:

  • la tabla y recrearla.

  • Use UNION=(...) para cambiar la lista de tablas subyacentes.

  • Cambie el fichero y realice un comando para la tabla y todas las tablas subyacentes para forzar al motor de almacenamiento a leer el nuevo fichero de definición.

Las tablas 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 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 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 para las otras. Puede tener distintas tablas 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 que reparar una única tabla grande.

  • Mapear instantáneamente varias tablas como una. Una tabla no necesita mantener un índice propio ya que usa los índices de las tablas individuales. Como resultado, las colecciones de tablas son muy rápidas de crear o remapear. (Tenga en cuenta que debe especificar las definiciones de índices cuando crea una tabla , 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 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 está ligada a este límite, pero una colección de tablas no lo está.

  • Puede crear un alias o sinónimo para una tabla definiendo una tabla 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 para cada lectura).

Las desventajas de las tablas son:

  • Sólo puede usar tablas idénticas para una tabla .

  • No puede usar un número de características en tablas . Por ejemplo, no puede crear índices en tablas . (Puede crear índices en las tablas subyacentes, puero no puede buscar en la tabla con búsquedas full-text.)

  • Si la tabla no es temporal, todas las tablas subyacentes deben ser permanentes. Si la tabla es temporal, las tablas pueden ser cualquier mezcla de tablas temporales y no temporales.

  • Las tablas usan más descriptores de fichero. Si 10 clientes usan una tabla 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 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 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 sean mucho más lentas en búsquedas , pero no mucho más lentas en búsquedas . Consulte Sección 7.2.1, “Sintaxis de (Obtener información acerca de un )” para más información sobre y .

14.2.1. Problemas con tablas MERGE

A continuación se describen problemas conocidos con tablas :

  • Si usa para cambiar una tabla a otro tipo de tabla, el mapeo de las tablas subyacentes se pierde. En su lugar, los registros de las tablas subyacentes se copian en la tabla alterada, que luego se asigna al nuevo tipo.

  • no funciona.

  • No puede usar , , sin una cláusula , , , , o en alguna de las tablas que se mapean en una tabla abierta. Si lo hace, la tabla puede referirse a la tabla original, lo que conduce a resultados inesperados. La forma más fácil de solucionar esto es realizar un comando antes de realizar ninguna de estas operaciones para segurar que no quedan abiertas tablas .

  • Una tabla no puede mantener restricciones sobre la tabla entera. Cuando realiza un , los datos van a la primera o última tabla (dependiendo del valor de la opción ). MySQL se asegura que los valores de clave única sean únicos dentro de la tabla , pero no entre todas las tablas en la colección.

  • Cuando crea una tabla , no se chequea que las tablas subyacentes existan y tengan una estructura idéntica. Cuando se usa la tabla , 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 tabla de tablas disimilares, es muy posible que tenga problemas extraños.

  • El orden de índices en la tabla y sus tablas subyacentes debe ser el mismo. Si usa para añadir un índice a una tabla usada en una tabla , y después usa para añadir un índice no único en la tabla , la ordenación de índice es distinta para las tablas si ya hay un índice no único en las tabla subyacentees. (Esto es porque pone los índices 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.

  • en una tabla en uso por una tabla no funciona en Windows ya que el mapeo del motor de almacenamiento está escondido por la capa superior de MySQL. Desde Windows no se permite el borrado de ficheros abiertos, debe volcar todas las tablas (con ) o borrar la tabla antes de borrar la tabla.