Inserção do InnoDB mais rápida


8

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_isolationcomo READ-COMMITTEDou READ-UNCOMMITTED(na verdade READ-COMMITED)
  • definido innodb_flush_log_at_trx_commitcomo 0ou 2(na verdade 0)
  • definido innodb_buffer_pool_sizepara 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_threade innodb_io_write_thread? Se você precisar de mais informações, por favor me diga.

Respostas:


9

SUGESTÃO # 1

Se sua máquina possui vários núcleos, você precisa aumentar o seguinte:

[mysqld]
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000

Quem são esses?

  • innodb_read_io_threads - O número de threads de E / S para operações de leitura no InnoDB.
  • innodb_write_io_threads - O número de threads de E / S para operações de gravação no InnoDB.
  • innodb_io_capacity - Um limite superior na atividade de E / S executada pelas tarefas em segundo plano do InnoDB, como liberar páginas do buffer pool e mesclar dados do buffer de inserção.

SUGESTÃO # 2

Para separar dados e índices do espaço de tabela do sistema (ibdata1), é necessário executar uma reestruturação completa do InnoDB. Parece complicado, mas é muito direto. 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

  • Corre SET GLOBAL innodb_fast_shutdown = 0;
  • mysqldump todos os dados em um dump SQL
  • service mysql stop
  • Exclua os seguintes arquivos
    • ibdata1
    • ib_logfile0
    • ib_logfile1
  • service mysql start

Antes de executar service mysql start, adicione esta linha amy.cnf

innodb_open_files=32768

Dessa forma, haverá identificadores de arquivo dedicados a cada tabela individual. O padrão é 300. Sabe-se que os identificadores de arquivo 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 em um pequeno número de tabelas.


Obrigado por suas sugestões. Vou tentar sugestão # 2 agora, e eu vou ajustar innodb_read_io_threads, innodb_write_io_threadse `innodb_io_capacity'.
Inhoiro

"Exclua os seguintes arquivos ibdata1" Sheesh, sem aviso.
magallanes 18/03

6

Existe um documento inteiro dedicado ao carregamento em massa de dados no InnoDB. Os pontos principais:

  1. desabilite a confirmação automática para evitar uma descarga extra de log para cada instrução de inserção: SET autocommit=0;...sql import;COMMIT;
  2. desabilite verificações estrangeiras e exclusivas (você não pode desabilitar todos os índices completamente):

    SET unique_checks=0;
    SET foreign_key_checks=0;
    
  3. Defina innodb_autoinc_lock_mode como 2 em vez de 1 (o padrão). Aqui está a documentação sobre essa configuração.

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).


Obrigado pela sua resposta! A inserção em massa parece tão rápida e tentarei mais tarde.
Inhoiro

Basta definir a confirmação automática = 0 aumentada por ordem de magnitude. Obrigado!
Alex Barker

1

Você pode usar os seguintes métodos para acelerar inserções:

  • Se você estiver inserindo muitas linhas do mesmo cliente ao mesmo tempo, use INSERTinstruções com várias VALUESlistas para inserir várias linhas por vez. Isso é consideravelmente mais rápido (muitas vezes mais rápido em alguns casos) do que usar INSERTinstruçõ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.
  • Ao carregar uma tabela de um arquivo de texto, use LOAD DATA INFILE. Isso geralmente é 20 vezes mais rápido do que usar INSERTinstruções. Vejo
  • Aproveite o fato de as colunas terem valores padrão. Insira valores explicitamente apenas quando o valor a ser inserido diferir do padrão. Isso reduz a análise que o MySQL deve fazer e melhora a velocidade de inserção.
  • Consulte a Seção 9.5.5, “ Carregamento de dados em massa para tabelas do InnoDB ” para obter dicas específicas sobre as tabelas do InnoDB.

0

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?


Obrigado pela sua resposta. Estou usando o InnoDB. Eu prefiro o plano A ao plano B. LOAD DATAparece tão rápido, mas precisamos gravar dados no texto de uma só vez como CSV e usar LOAD DATAcerto? / Vou definir buffer_pool_sizepara 4 GB.
Inhoiro
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.