Eu arquivo milhões de arquivos XML (1-100 MB cada) em uma tabela com a estrutura de
CREATE TABLE Data
(
ID int(11) unsigned NOT NULL,
XML longtext COMPRESSED,
PRIMARY KEY(ID)
) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE utf8_general_ci ROW_FORMAT=DYNAMIC;
INSERT INTO Data (ID,XML) VALUES ($id,LOAD_FILE('file.xml'));
O processo é lento, cerca de 2 a 5 inserções/segundo. O banco de dados inteiro seria muito grande para uma unidade SDD, e eu crio o banco de dados em um HDD separado, mas movo os arquivos em lotes para uma unidade SDD para tornar a leitura mais rápida. Observe que a velocidade do disco não é a etapa determinante da taxa, pois os dados XML são enormemente reduzidos pela compactação.
Tentei InnoDB
obter inserção simultânea, mas o tamanho do InnoDB ibd é três vezes maior que o ARIA/MyISAM, e o InnoDB é muito mais lento no HDD.
Eu tentei ROCKSDB
, mas não pode ser criado em um disco separado, pois existe um único diretório para todas as tabelas. Além disso, o gerenciamento de memória do ROCKSDB é péssimo para tais cenários (ou não consegui encontrar a configuração adequada).
Não testei ARCHIVE
o desempenho do motor, pois ele precisa ID
estar em ordem.
Minha solução atual é INSERT simultaneamente em uma tabela temporária do InnoDB no SSD e depois INSERT INTO SELECT
da tabela InnoDB para a tabela ARIA no HDD. O problema é a integridade e o atraso no esvaziamento do InnoDB e no início do processo INSERT simultâneo.
Agradeço qualquer solução possível.
É muito trabalhoso colocar todos esses arquivos no banco de dados.
Pergunta: O que você vai fazer com eles quando estiverem lá?
Se a resposta for algo como...
... então sua solução é simples. Não faça isso!
Esse seria um caso clássico de incorrer em muita sobrecarga para colocá-los no banco de dados, seguido de mais sobrecarga para retirá-los novamente , apenas para usá-los como os arquivos com os quais começaram.
Se você decidir que precisa mantê-los no banco de dados, então...
Essa é uma estrutura de tabela muito simples e presumo que você só recuperará toda a "placa" de Xml de uma só vez, com base na
id
coluna. Se você for fazer qualquer outra coisa , deve estar pensando que pode precisar extrair os dados que deseja filtrar em colunas simples. Sim, existem índices sofisticados com reconhecimento de XML atualmente, mas eles nunca terão um desempenho tão bom quanto uma única coluna com um índice.Algumas notas:
COMPRESSED
reduz cerca de 50% do espaço em disco.LONGBLOB
, nãoLONGTEXT
. E exige que os clientes descompactem durante a leitura.id
eLONGBLOB
.id
efilename
(ou caminho).