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-database
shell>ls -1 t1.MYI t2.MYI > total.MRG
shell>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.