Pergunta

Um dos meus projetos usam o motor MyISAM no MySQL, mas estou pensando em mudar para InnoDB como eu precisam de apoio transação aqui e ali.

  • O que devo olhar ou considerar antes de fazer isso?
  • Posso apenas mudar o motor, ou deve os dados estar preparado para isso?
Foi útil?

Solução

Sim, com certeza, há muitas coisas, você deve testar a sua aplicação extremamente bem:

  • As transações podem impasse e necessidade de ser repetido. Este é o caso (em algumas circunstâncias), mesmo com uma transação autocommitted que só insere uma linha.
  • uso Disc quase certamente aumentará
  • I / carga S durante as gravações quase certamente irá aumentar
  • Comportamento de indexação vai mudar porque o InnoDB utiliza índices agrupados - este pode ser um efeito benéfico em alguns casos
  • A sua estratégia de backup serão impactados. Considere isso cuidadosamente.

O processo de migração em si terá de ser cuidadosamente planejado, como ele vai levar um longo tempo se você tem um monte de dados (período durante o qual os dados serão ou somente leitura, ou completamente indisponíveis - fazer cheque)

Outras dicas

Há uma grande limitação. Se você receber qualquer tipo de falha de hardware (ou similar) durante uma gravação, o InnoDB tabelas corruptos.

MyISAM também vai, mas um mysqlcheck --auto-reparação irá repará-los. Tentando isso com tabelas InnoDB irá falhar. Sim, esta é a experiência.

Isto significa que você precisa ter um bom plano de backup regular de dados para usar InnoDB.

Algumas outras notas:

InnoDB faz o espaço livre não realocar no sistema de arquivos depois de cair de uma mesa / banco de dados ou excluir um registro, isso pode ser resolvido por "dumping e importação" ou a criação innodb_file_per_table=1 em my.cnf.

Adicionar / remover índices em uma tabela InnoDB grande pode ser bastante doloroso, porque ele bloqueia a tabela atual, cria um temporário com os seus índices alterados e insere dados - linha por linha. Há um plugin Innobase , mas funciona apenas para MySQL 5.1

InnoDB também é muito mais memória intensa, eu sugiro que você tenha tão grande variável innodb_buffer_pool_size como seu memória do servidor permite (70-80% devem ser uma aposta segura). Se o servidor for UNIX / Linux, considerar a redução vm.swappiness variável sysctl a 0 e uso innodb_flush_method=O_DIRECT para evitar buffer duplo. Sempre teste se você bater swap quando alternando os values.You sempre pode ler mais em Percona blogue , que é grande.

Além disso, você pode executar mysqlbackup com --single-transaction --skip-lock-tables e não têm bloqueios de tabela enquanto o backup está começando.

Em qualquer caso, InnoDB é grande, não deixe que algumas armadilhas desanimá-lo.

Apenas alterando a tabela e definir o motor deve ser fino.

  • Uma das grandes para estar atento é que select count(*) from MyTable é muito mais lento no InnoDB do que MyISAM.
  • o valor de AUTO_INCREMENT será reajustada para o valor mais alto na tabela +1 após a reinicialização do servidor -. Isso pode causar problemas engraçado se você tiver um db confuso com algumas exclusões
  • configurações do servidor Optimum estão indo ser diferente para um db principalmente MyISAM.
  • Verifique se o tamanho do arquivo do InnoDB é grande o suficiente para armazenar todos os seus dados ou você vai ser crucificado por realocação constante quando você muda os motores das tabelas.

Se você está pretendendo usar InnoDB como uma maneira de obter consultas simultâneas, então você vai querer definir innodb_file_trx_commit=1 para que você obtenha alguns de volta desempenho. OTOH, se você estivesse olhando para re-código de seu aplicativo para ser transação ciente, em seguida, decidir essa configuração fará parte da revisão geral desempenho necessário das configurações InnoDB.

O outro grande coisa a observar é que o InnoDB não suporta índices FullText, nem INSERT DELAYED. Mas então, MyISAM não suporta a integridade referencial. : -)

No entanto, você pode se mover ao longo somente as tabelas que você precisa transação ciente. Eu fiz isso. Pequenas mesas (até vários milhares de linhas) muitas vezes pode ser alterado on-the-fly, aliás.

As características de desempenho pode ser diferente, então você pode precisar de manter um olho sobre a carga.

Os dados vai ficar bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top