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.
berkes
fonte
É 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:

RolandoMySQLDBA
fonte
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.

geewiz
fonte