Tabelas MERGE são novas no MySQL Versão
3.23.25. O código ainda está em gamma, mas deve estar
razoavelmente estável.
Uma tabela MERGE (também conhecida como tabela
MRG_MyISAM) é uma coleção de tabelas
MyISAM idênticas que podem ser usada como uma.
Você só pode fazer SELECT,
DELETE, e UPDATE da
coleção de tabelas. Se você fizer um DROP na
tabela MERGE, você só está apagando a
especificação de MERGE.
Note que DELETE FROM tabela_merge usado sem um
WHERE só limpará o mapeamento a tabela, não
deletando tudo nas tabeals mapeadas. (Planejamos consertar isto na
versão 4.1).
Com tabelas idênticas queremos dizer que todas as tabelas são
criadas com informações de colunas e chaves idênticas. Você
não pode fundir tabelas nas quais as colunas são empacotadas de
forma diferente, não tenham as mesmas colunas ou tenham as chaves
em ordem diferente. No entanto, algumas das tabelas podem ser
compactadas com myisampack. See
Secção 4.8.4, “myisampack, O Gerador de Tabelas Compactadas de
Somente Leitura do MySQL”.
Ao criar uma tabela MERGE, você obterá uma
arquivo de definição de tabela .frm e um
arquivo de lista de tabela .MRG. O arquivo
.MRG contém apenas a lista de arquivos
índices (arquivos .MYI) que devem ser usados
como um. Antes da versão 4.1.1, todas as tabelas usadas devem
estar no mesmo banco de dados assim como a própria tabela
MERGE.
Atualmente você precisa ter os privilégios
SELECT, UPDATE e
DELETE em tabelas mapeadas para uma tabela
MERGE.
Tabelas MERGE podem ajudá-lo a resolver os
seguintes problemas:
Facilidade de gernciamento de um conjunto de log de tabelas.
Por exemplo, você pode colocar dados de meses diferentes em
arquivos separadosfrom different months into separate files,
compress some of them with myisampack, and
then create a MERGE to use these as one.
Lhe da maior velocidade. Você pode separar uma grande tabela
somente leitura baseado em algum critério e então colocar as
diferentes partes da tabela em discos diferentes. Uma tabela
MERGE desta forma pode ser muito mais
rápida que se usada em uma grande tabela. (Você pode, é
claro, usar também um nível RAID para obter o memo tipo de
benefício.)
Faz pesquisas mais eficientes. Se você sabe exatamente o que
você esta procurando, você pode buscar em apenas um dos
pedaços da tabelas para algumas pesquisas e utilizar tabelas
MERGE para outras. Você pode até ter
diferentes tabelas MERGE ativas, com
possíveis arquivos sobrepostos.
Reparações mais eficientes. É facil reparar os arquivos
individuais que são mapeados para um arquivo
MERGE que tentar reparar um arquivo
realmente grande.
Mapeamento instantâneo de diversos arquivos como um. Uma
tabela MERGE usa o índice de tabelas
individuais. Não é necessário manter um índice de para
ela. Isto torna a coleção de tabelas
MERGE MUITO rápido de fazer ou remapear.
Note que você deve especificar a definição de chave quando
você cria uma tabela MERGE!.
Se você tem um conjunto de tabelas que você junta a uma
tabela grande por demanda ou bacth, você deveria criar uma
tabela MERGE delas por demanda. Isto é
muito mais rápido é economizará bastante espaço em disco.
Contornam o limite de tamanho de arquivos do sistema operacional.
Você pode criar um apelido/sinônimo para uma tabela usando
MERGE sobre uma tabela. Não deve haver
nenhum impacto notável na performance ao se fazer isto
(apenas algumas chamadas indiretas e chamadas de
memcpy() para cada leitura).
As desvantagens de tabelas MERGE são:
Você só pode utilizar tabelas MyISAM
idênticas em uma tabela MERGE.
REPLACE não funciona.
Tabelas MERGE usam mais descritores de
arquivos. Se você estiver usando uma tabela
MERGE que mapeia mais de 10 tabelas e 10
usuários a estão usando, você está usando 10*10 + 10
descritores de arquivos. (10 arquivos de dados para 10
usuários e 10 arquivos de índices compartilhados).
A leitura de chaves é lenta. Quando você faz uma leitura
sobre uma chave, o mecanismo de armazenamento
MERGE precisará fazer uma leitura em todas
as tabelas para verificar qual casa melhor com a chave dada.
Se você então fizer uma "leia próximo", o mecanismo de
armazenamento MERGE precisará procurar os
buffers de leitura para encontrar a próxima chave. Apenas
quando um buffer de chaves é usado, o mecanismo de
armazenamento precisará ler o próximo bloco de chaves. Isto
torna as chaves MERGE mais lentas em
pesquisas eq_ref, mas não em pesquisas
ref. See Secção 5.2.1, “Sintaxe de EXPLAIN (Obter informações sobre uma
SELECT)”.
Você não pode fazer DROP TABLE,
ALTER TABLE, DELETE FROM
nome_tabela sem uma cláusula
WHERE, REPAIR TABLE,
TRUNCATE TABLE, OPTIMIZE
TABLE, ou ANALYZE TABLE em
nenhuma das tabelas que é mapeada por uma tabela
MERGE que está "aberta". Se você fizer
isto, a tabela MERGE pode ainda se referir
a tabela original e você obterá resultados inexperados. O
modo mais fácil de contornar esta deficiência e através do
comando FLUSH TABLES, assegurando que
nenhuma tabela MERGE permanecerá "aberta".
Quando você cria uma tabela MERGE você deve
especificar com UNION=(lista-de-tabelas) quais
tabelas você quer usar com uma. Opcionalmente você pode
especificar com INSERT_METHOD se você quer que
inserções em tabelas MERGE ocorram na
primeira ou na última tabela da lista UNION.
Se você não especificar INSERT_METHOD ou
especificar NO, entaão todos os comandos
INSERT na tabela MERGE
retornarão um erro.
O seguinte exemplo lhe mostra como utilizaqr tabelas
MERGE:
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20))
TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
SELECT * FROM total;
Note que não criamos uma chave UNIQUE ou
PRIMARY KEY na tabela total
já que a chave não será única na tabela
total.
Note que você também pode manipular o arquivo
.MRG diretamente de fora do servidor MySQL:
shell>cd /mysql-data-directory/current-databaseshell>ls -1 t1.MYI t2.MYI > total.MRGshell>mysqladmin flush-tables
Agora você pode fazer coisas como:
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
Note que a coluna a, declarada como
PRIMARY KEY, não é unica, já que tabelas
MERGE não podem forca a unicidade sobre um
conjunto de tabelas MyISAM selecionadas.
Para remapear uma tabela MERGE você pode fazer
o seguinte:
Fazer um DROP na tabela e recriá-la
Usar ALTER TABLE nome_tabela UNION=(...)
Alterar o arquivo .MRG e executar um
FLUSH TABLE na tabela
MERGE e todas as tabelas selecionadas para
forçar o mecanismo de armazenamento a ler o novo arquivo de
definição.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.
