Banco de dados Drupal innodb ou MyISAM?

10

Eu tenho um site Drupal e estou com problemas de desempenho. Encontrei Como converter um banco de dados do MyISAM para o InnoDB? indicando que o desempenho pode melhorar alternando.

Como posso saber se meu banco de dados MySQL é InnoDB ou MyISAM?

chrisjlee
fonte
1
O tipo de tabela não está vinculado ao catálogo. Você pode ter um catálogo com uma mistura de tabelas MyISAM e InnoDB.
mpdonadio
2
Embora haja benefícios para as otimizações nesse nível, duvido muito que a alteração dos tipos de tabela resolva seus problemas de desempenho. A diferença não é tão grande assim.
Letharion
1
@ Chris J. Lee, isso está correto. A mistura de tipos de tabela pode ser usada por razões de desempenho ou para explorar os recursos disponíveis apenas para um tipo de tabela específico (por exemplo, pesquisa FULLTEXT com tabelas MyISAM). Isso também pode acontecer acidentalmente, se você alterar os padrões do mysqld e criar mais tabelas em um catálogo :)
mpdonadio
2
Letharion: isso é simplesmente incorreto. Os tipos de tabela e a maneira como o mysql é configurado para eles têm um enorme impacto no desempenho!
Walter Heck
2
@Letharion: De fato, deixando de lado as melhorias arquiteturais, ganhos de desempenho muito grandes no caso de concorrência com SELECTs e UPDATEs misturados - um UPDATE bloqueará uma tabela no MyISAM, mas apenas uma linha no InnoDB - significa que grandes aumentos de desempenho podem ser visto com nada mais do que mudar o mecanismo de uma tabela. Agora, se você estiver fazendo uma consulta boba, estará fazendo uma consulta boba, e a alteração dos tipos de tabela não ajudará. Mas descartar a troca de motores de imediato é igualmente incorreto.
BMDan

Respostas:

8

Você pode executar uma consulta personalizada:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

para listar todas as tabelas em seu banco de dados e o mecanismo usado para cada um.

Como alternativa, você pode fazer login no seu banco de dados usando o phpMyAdmin e selecionar seu banco de dados ... você verá o mecanismo na Typecoluna da lista de tabelas.

Pessoalmente, eu recomendaria o Navicat para MySQL , é uma GUI MySQL muito boa e facilita muito a descoberta de coisas como essa.

Fonte: http://www.electrictoolbox.com/mysql-table-storage-engine/

Clive
fonte
A antiga ferramenta MySQL Administrator também funciona bem para coisas como esta. Se você procurar no site do MySQL, ainda poderá encontrar o instalador.
mpdonadio
@MPD Uau, isso ainda está acontecendo? É preciso fazer o download, mesmo que apenas por um pouco de nostalgia :)
Clive
O Administrador e o Navegador de consultas estão oficialmente obsoletos e sem suporte agora, mas você ainda pode baixá-los. Eu odeio o Workbench e ainda os uso.
mpdonadio
Para ver uma saída semelhante à que você viu no phpMyAdmin na linha de comando, use SHOW TABLE STATUS. Para obter uma contagem simples de quantas tabelas existem em cada tipo de mecanismo, é isso SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan
7

Apenas tentar as coisas para obter um site mais rápido é como mudar de carro às cegas e espero que você consiga um mais rápido na próxima vez.

Primeiro experimente os frutos baixos, se não ajudar, tente encontrar o gargalo real.

  1. Você ativou os mecanismos integrados: cache de página (eficaz apenas para usuários anônimos), agregação CSS e JS?
  2. Se o seu host oferecer um cache de código de operação como o APC, ative-o.
  3. Configure seu local Drupal, incluindo o banco de dados completo.
  4. Verifique se o XDebug está em execução.
  5. Comece a criar um perfil de desempenho real. Dessa forma, você pode identificar qual parte do seu site consome muito tempo. Quanto mais lento o seu site, mais fácil é encontrar o código / componente culpado.

Geralmente, é apenas uma consulta lenta ao banco de dados que precisa de um índice ou de um módulo que faz as coisas de maneira lenta.

Eu também descobri grandes diferenças entre hosters. Se você instalar um drupal novo imediatamente, o desempenho está bom? Caso contrário, é hora de procurar outro hoster.

BetaRide
fonte
6

Minha melhor experiência foi decidir por tabela. O InnoDB é bom, porque pode evitar o bloqueio de tabelas (nenhum outro processo pode ler de uma tabela enquanto um processo é gravado), mas funciona muito bem com COUNT (), que é usado frequentemente para consultas de pager.

(Editar: veja o comentário do Clives abaixo)

Também existem implicações na sua configuração do MySQL, dependendo do banco de dados que você está usando. Se você tem acesso ao servidor, o mysqltuner deve ser sua primeira etapa, para verificar a configuração:

https://github.com/rackerhacker/MySQLTuner-perl#readme

Martin
fonte
2
+1 Eu não sabia que o InnoDB era lento para COUNTconsultas, de acordo com este artigo do ex-gerente do High Performance Group para MySQL, apesar de realmente afetar apenas uma consulta que contém COUNT(*) sem uma WHEREcláusula.
Clive
3
O motivo é que o MyISAM mantém um valor por tabela para o número de linhas na tabela, o que significa que um simples SELECT COUNT(*) FROM tablepode retornar instantaneamente com esse valor. O InnoDB não faz, portanto, ele deve verificar todo o índice de chave primária. Dito isto, enquanto o Drupal faz muito SELECT COUNT(*), só consigo pensar em um lugar no código inteiro que o faz sem uma WHEREcláusula. Portanto, não use o MyISAM por motivo de preocupação com essa edição específica. O InnoDB com um buffer pool de tamanho decente será mais rápido para todas as consultas do mundo real.
BMDan 17/05
5

FWIW, nosso site Drupal 6.x de quase 20K nós estava com alguns problemas de desempenho e escolhi mudar todas as tabelas para o InnoDB. Foi fácil e a maneira como lidei com isso foi usar o mysqldump para despejar todo o conteúdo em um arquivo sql, usar um editor (sed) para substituir todas as ocorrências do MyISAM para o InnoDB e recarregar o banco de dados a partir desse arquivo. Uma das desvantagens é que você não pode recuperar espaço de um banco de dados InnoDB (IIRC), mas contanto que mantenha suas tabelas duplicadas em um banco de dados separado, não deverá ter problemas. Ah, e vimos um aumento significativo no desempenho. E como temos quatro instâncias do Drupal, o grande número de arquivos de tabela foi eliminado do sistema de arquivos (sim, eles estão contidos no próprio arquivo InnoDB). Este é o meu valor de $ .02.

bobmct
fonte
2
Ter um único espaço de tabela do InnoDB pode economizar inodes, mas (como você mesmo mencionou) à custa do espaço em disco. Mesmo se você excluir muitos dados, não poderá recuperar esse espaço em disco. Isso também resulta em grandes arquivos de backup desnecessários e na impossibilidade de restaurar tabelas únicas. É por isso que prefiro usar a innodb_file_per_tableopção.
geewiz
1
Além disso, você pode converter tabelas no local: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Adicione opções apropriadas ( -uroot -psomepass, por exemplo) aos dois mysqls, se necessário.
BMDan 17/05
5

Apenas um aviso. Se você estiver no Drupal 6, você pode instalar o módulo DBTuner ; ele pode facilmente mover suas tabelas do MyISAM para o InnoDB. Então, sim, há um módulo para isso!

mikeytown2
fonte