Quais tabelas devem ou podem ser migradas para o InnoDB e quais devem permanecer MyISAM?


10

Conforme o título: existe uma lista rápida de candidatos para a migração de tabelas para o InnoDB? E o que deve permanecer MyISAM.

Algumas informações adicionais

  • O site tem uma carga de leitura bastante pesada, mas insere aproximadamente 10 nós por hora, com tags e afins.
  • Fazemos muito uso do CCK (uma enorme quantidade de tabelas normalizadas na forma de content_field%).
  • Também usamos Views para quase todos os nossos blocos e páginas; mas muitos deles são candidatos à substituição por módulos personalizados (para reduzir as consultas ao banco de dados e o peso dessas consultas).
  • Os usuários são todos anônimos; com exceção de alguns editores e webmasters conectados.

É hilário a Internet inteira não ter idéia de como realmente responder a essa pergunta. Quais tabelas Drupal recebem mais gravações e ficam bloqueadas .... quem sabe.
JM Becker

Respostas:


8

Você deve converter todos os dados para o InnoDB para evitar problemas de bloqueio de tabela. No entanto, aqui estão algumas coisas para pensar:

Indexação FULLTEXT

No momento, apenas o MyISAM suporta a indexação FULLTEXT. A indexação do FULLTEXT para o InnoDB está atualmente em andamento para o MySQL 5.6, mas não está pronta para produção . Se você tiver alguma tabela Drupal que possua índices FULLTEXT, ela não poderá ser convertida no InnoDB no momento.

UPDATE na indexação FULLTEXT

O MySQL 5.6 agora é GA (disponível para uso em produção). Por favor, tente a indexação FULLTEXT no InnoDB.

Para localizar as tabelas que possuem um FULLTEXTíndice, execute esta consulta:

SELECT table_schema,table_name
FROM information_schema.statistics
WHERE index_type='FULLTEXT';

Se nenhuma linha retornar, converta todas as tabelas do InnoDB para o conteúdo do seu coração. Eu escrevi um post anterior sobre como converter todas as tabelas MyISAM para InnoDB usando apenas mysql .

Replicação MySQL

Se você tiver um ambiente com muita leitura, as leituras podem ser mais rápidas no MyISAM se você fizer o seguinte:

  • Configurar Replicação Mestre / Escravo
  • Crie um ou mais Read Slaves sob o Master
  • Adicione --skip-innodb/etc/my.cnf em todos os Slaves (converte tabelas para MyISAM ao carregar dados no Slave)
  • Mude o formato da linha de todas as tabelas MyISAM em todos os Slave para FIXED por este comando: ALTER TABLE tblname ROW_FORMAT=FIXED;
  • Postei algo sobre isso no DBA StackExchange
  • O livro MySQL Database Design and Tuning recomenda o uso ROW_FORMAT=FIXEDnas páginas 72,73. Isso converterá internamente todos os campos VARCHAR em CHAR. Isso aumentará a tabela MyISAM, mas os SELECTs executados serão muito mais rápidos. Eu pessoalmente posso atestar isso. Certa vez, tive uma mesa com 1,9 GB. Eu mudei o formato com ALTER TABLE tblname ROW_FORMAT=FIXED. A tabela acabou com 3,7 GB. A velocidade dos SELECTs foi 20-25% mais rápida sem melhorar ou alterar qualquer outra coisa.

A única dor de cabeça com isso é tornar seu aplicativo ciente de escravos de leitura separados.

EPÍLOGO

Se você estiver procurando outros benefícios que cada mecanismo de armazenamento possui, verifique o DBA StackExchange:


4

Como o site está no lado de leitura pesada, eu simplesmente converteria todas as tabelas para o InnoDB. Você poderá otimizar o desempenho da leitura dimensionando o buffer pool do InnoDB e o cache de consulta adequadamente. Dessa forma, estamos obtendo milhares de consultas por segundo nos servidores de banco de dados dedicados em nossa infraestrutura de hospedagem Drupal.

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.