Sou um estudante de pós-graduação pesquisando OLAP com Mondrian OLAP. Portanto, desejo inserir dados no InnoDB (MySQL 5.5) mais rapidamente no carregamento inicial. Nesse ambiente, o único usuário sou eu, então acho que pode permitir configurações mais soltas para velocidade de inserção. No momento, estou usando as seguintes técnicas.
- desabilitar
log_bin
- permitir
skip-innodb-doublewrite
- definido
transaction_isolation
comoREAD-COMMITTED
ouREAD-UNCOMMITTED
(na verdadeREAD-COMMITED
) - definido
innodb_flush_log_at_trx_commit
como0
ou2
(na verdade0
) - definido
innodb_buffer_pool_size
para 5 GB (o sistema tem 6 GB de RAM)
Existem mais técnicas para inserção mais rápida no InnoDB? E eu tenho que modificar innodb_io_read_thread
e innodb_io_write_thread
? Se você precisar de mais informações, por favor me diga.
SUGESTÃO #1
Se sua máquina tiver vários núcleos, você precisará aumentar o seguinte:
Quem são esses?
SUGESTÃO #2
Para separar dados e índices do tablespace do sistema (ibdata1), você precisa realizar uma reestruturação completa do InnoDB. Parece complicado, mas é muito simples. Escrevi sobre isso no DBA StackExchange (29 de agosto de 2012) e no StackOverflow (29 de outubro de 2010) . Os passos básicos são
SET GLOBAL innodb_fast_shutdown = 0;
service mysql stop
ibdata1
ib_logfile0
ib_logfile1
service mysql start
Antes de executar
service mysql start
, adicione esta linha amy.cnf
Dessa forma, haverá manipuladores de arquivos dedicados a cada tabela individual. O padrão é 300. Sabe-se que os manipuladores de arquivos são armazenados em cache. Haverá uma desaceleração se você definir isso muito alto e atingir o teto rapidamente . Este não deve ser o caso se você estiver trabalhando com um pequeno número de tabelas.
Há um documento inteiro dedicado ao carregamento de dados em massa no InnoDB. Os pontos principais:
SET autocommit=0;...sql import;COMMIT;
desativar verificações estrangeiras e exclusivas (você não pode desativar todos os índices completamente):
O terceiro pode ou não ajudá-lo, então sugiro ler esse link para ver como você está carregando os dados inicialmente. Por exemplo, se você estiver dividindo as cargas em várias inserções para executar simultaneamente, isso definitivamente ajudará você a definir o valor como 2. Se você estiver fazendo uma grande inserção de várias linhas, não fará muito (se houver) para ajuda.
Como você está desligando o log binário para esta inserção inicial, não deve se preocupar com as lacunas nos números de incremento automático (se estiver fazendo inserções simultâneas).
Você pode usar os seguintes métodos para acelerar as inserções:
INSERT
instruções com váriasVALUES
listas para inserir várias linhas de uma vez. Isso é consideravelmente mais rápido (muitas vezes mais rápido em alguns casos) do que usarINSERT
instruções de linha única separadas. Se estiver adicionando dados a uma tabela não vazia, você pode ajustar a variável bulk_insert_buffer_size para tornar a inserção de dados ainda mais rápida.LOAD DATA INFILE
. Isso geralmente é 20 vezes mais rápido do que usarINSERT
instruções. VerPlano A: INSERTs "Batch" -- várias linhas por instrução INSERT. Sugira cerca de 1.000 linhas por instrução. autocommit=on, sem BEGIN...COMMIT explícito
Plano B: CARREGAR DADOS
Se você inserir muitas linhas de uma vez, o InnoDB deve fazer mais trabalho para poder reverter a inserção se houver uma falha. Por esse motivo, discordo do autocommit=off, que colocaria todo o conjunto em uma única transação.
LOAD DATA de todo o conjunto de linhas pode ter o mesmo problema, mas é bem rápido.
buffer_pool = 5G de 6G está prestes a ser muito grande. Se houver alguma troca, o desempenho cairá.
O particionamento provavelmente o tornaria mais lento.
SHOW CREATE TABLE -- Chaves secundárias podem ser uma desvantagem séria.
Você está usando InnoDB? ou XtraDB?