Estou com dificuldades para importar em massa uma tabela InnoDB bastante grande, composta por aproximadamente 10 milhões de linhas (ou 7 GB) (que para mim é a maior tabela com a qual trabalhei até agora).
Eu fiz algumas pesquisas sobre como melhorar a velocidade de importação do Inno e, no momento, minha configuração fica assim:
/etc/mysql/my.cnf/
[...]
innodb_buffer_pool_size = 7446915072 # ~90% of memory
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_thread_concurrency=0
innodb_doublewrite = 0
innodb_log_file_size = 1G
log-bin = ""
innodb_autoinc_lock_mode = 2
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_instances=8
import is done via bash script, here is the mysql code:
SET GLOBAL sync_binlog = 1;
SET sql_log_bin = 0;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
LOAD DATA LOCAL INFILE '$filepath' INTO TABLE monster
COMMIT;
Os dados são fornecidos em um CSV
arquivo.
Atualmente, testei minhas configurações com 'dumps de teste' menores, com 2 milhões, 3 milhões de ... linhas cada e uso time import_script.sh
para comparar o desempenho.
A desvantagem é que eu só tenho um tempo de execução geral, portanto, tenho que esperar a importação completa terminar para obter um resultado.
Meus resultados até agora:
- 10 000 linhas: <1 segundo
- 100 000 linhas: 10 segundos
- 300 000 linhas: 40 segundos
- 2 milhões de linhas: 18 minutos
- 3 milhões de linhas: 26 minutos
- 4 milhões de linhas: (cancelada após 2 horas)
Parece que não existe uma solução para o 'livro de receitas' e é preciso descobrir a combinação ideal de configurações por conta própria.
Além de sugestões sobre o que mudar na minha configuração, eu também gostaria muito de obter mais informações sobre como eu poderia avaliar melhor o processo de importação / obter mais informações sobre o que está acontecendo e onde pode estar o gargalo.
Tentei ler a documentação para as configurações que estou alterando, mas, novamente, não conheço nenhum efeito colateral e se posso diminuir o desempenho com um valor mal escolhido.
No momento, gostaria de tentar uma sugestão do chat para usar MyISAM
durante a importação e alterar o mecanismo da tabela posteriormente.
Gostaria de tentar isso, mas, no momento, minha DROP TABLE
consulta também leva horas para terminar. (Que parece outro indicador, minha configuração é menor que a ideal).
Informações adicionais:
A máquina que estou usando no momento possui 8 GB de RAM e um disco rígido híbrido de estado sólido com 5400 RPM.
Embora também pretendamos remover dados obsoletos da tabela em questão, ainda preciso de uma importação um pouco rápida para
a) testar automatic data cleanup feature
durante o desenvolvimento
eb) no caso de nosso servidor travar, gostaríamos de usar nosso segundo servidor como um substituto (que precisa ser dados atualizados, a última importação levou mais de 24 horas)
mysql> SHOW CREATE TABLE monster\G
*************************** 1. row ***************************
Table: monster
Create Table: CREATE TABLE `monster` (
`monster_id` int(11) NOT NULL AUTO_INCREMENT,
`ext_monster_id` int(11) NOT NULL DEFAULT '0',
`some_id` int(11) NOT NULL DEFAULT '0',
`email` varchar(250) NOT NULL,
`name` varchar(100) NOT NULL,
`address` varchar(100) NOT NULL,
`postcode` varchar(20) NOT NULL,
`city` varchar(100) NOT NULL,
`country` int(11) NOT NULL DEFAULT '0',
`address_hash` varchar(250) NOT NULL,
`lon` float(10,6) NOT NULL,
`lat` float(10,6) NOT NULL,
`ip_address` varchar(40) NOT NULL,
`cookie` int(11) NOT NULL DEFAULT '0',
`party_id` int(11) NOT NULL,
`status` int(11) NOT NULL DEFAULT '2',
`creation_date` datetime NOT NULL,
`someflag` tinyint(1) NOT NULL DEFAULT '0',
`someflag2` tinyint(4) NOT NULL,
`upload_id` int(11) NOT NULL DEFAULT '0',
`news1` tinyint(4) NOT NULL DEFAULT '0',
`news2` tinyint(4) NOT NULL,
`someother_id` int(11) NOT NULL DEFAULT '0',
`note` varchar(2500) NOT NULL,
`referer` text NOT NULL,
`subscription` int(11) DEFAULT '0',
`hash` varchar(32) DEFAULT NULL,
`thumbs1` int(11) NOT NULL DEFAULT '0',
`thumbs2` int(11) NOT NULL DEFAULT '0',
`thumbs3` int(11) NOT NULL DEFAULT '0',
`neighbours` tinyint(4) NOT NULL DEFAULT '0',
`relevance` int(11) NOT NULL,
PRIMARY KEY (`monster_id`),
KEY `party_id` (`party_id`),
KEY `creation_date` (`creation_date`),
KEY `email` (`email`(4)),
KEY `hash` (`hash`(8)),
KEY `address_hash` (`address_hash`(8)),
KEY `thumbs3` (`thumbs3`),
KEY `ext_monster_id` (`ext_monster_id`),
KEY `status` (`status`),
KEY `note` (`note`(4)),
KEY `postcode` (`postcode`),
KEY `some_id` (`some_id`),
KEY `cookie` (`cookie`),
KEY `party_id_2` (`party_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=13763891 DEFAULT CHARSET=utf8
SHOW CREATE TABLE yourtable\G
para nos mostrar a estrutura da tabela dessa tabela de 10 milhões de linhas.
innodb_doublewrite = 0
), sua instalação do MySQL não é protegida contra falhas: se você tiver uma falha de energia (não uma falha no MySQL), seus dados poderão ser corrompidos silenciosamente.