Sou estudante de pós-graduação pesquisando OLAP com Mondrian OLAP. Então, eu quero 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 flexíveis para a velocidade de inserção. No momento, estou usando as seguintes técnicas.
- desabilitar
log_bin
- habilitar
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 possui 6 GB de RAM)
Existem mais técnicas para uma 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.
innodb_read_io_threads
,innodb_write_io_threads
e `innodb_io_capacity'.Existe um documento inteiro dedicado ao carregamento em massa de dados no InnoDB. Os pontos principais:
SET autocommit=0;...sql import;COMMIT;
desabilite verificações estrangeiras e exclusivas (você não pode desabilitar todos os índices completamente):
O terceiro pode ou não ajudá-lo, por isso sugiro a leitura desse link para ver como você está inicialmente carregando os dados. Por exemplo, se você estiver dividindo as cargas em várias inserções para execução simultânea, definitivamente ajudará a definir o valor para 2. Se você estiver executando uma inserção grande com várias linhas, ela não fará muito (se houver) Socorro.
Como você está girando 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).
fonte
Você pode usar os seguintes métodos para acelerar inserções:
INSERT
instruções com váriasVALUES
listas para inserir várias linhas por vez. Isso é consideravelmente mais rápido (muitas vezes mais rápido em alguns casos) do que usarINSERT
instruções de linha única separadas . Se você estiver adicionando dados a uma tabela não vazia, poderá 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. Vejofonte
Plano A: INSERTs "em lote" - várias linhas por instrução INSERT. Sugira cerca de 1000 linhas por instrução. autocommit = ativado, não explícito BEGIN ... COMMIT
Plano B: CARREGAR DADOS
Se você inserir muitas linhas ao mesmo tempo, o InnoDB deverá trabalhar mais para poder reverter a inserção, se houver uma falha. Por esse motivo, eu discordo de autocommit = off, que colocaria todo o conjunto em uma única transação.
CARREGAR DADOS de todo o conjunto de linhas pode ter o mesmo problema, mas é bastante rápido.
buffer_pool = 5G de 6G está prestes a ser muito grande. Se houver alguma troca, o desempenho cairá.
Particionar provavelmente tornaria o processo mais lento.
SHOW CREATE TABLE - Teclas secundárias podem ser uma desvantagem séria.
Você está usando o InnoDB? ou XtraDB?
fonte
LOAD DATA
parece tão rápido, mas precisamos gravar dados no texto de uma só vez como CSV e usarLOAD DATA
certo? / Vou definirbuffer_pool_size
para 4 GB.