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.