Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desempenho do MySQL:MyISAM vs InnoDB


Um fator importante no desempenho do banco de dados é o mecanismo de armazenamento usado pelo banco de dados e, mais especificamente, suas tabelas. Diferentes mecanismos de armazenamento fornecem melhor desempenho em uma situação em relação a outra. Para uso geral, existem dois contendores a serem considerados. Estes são o MyISAM, que é o mecanismo de armazenamento padrão do MySQL, ou InnoDB, que é um mecanismo alternativo integrado ao MySQL destinado a bancos de dados de alto desempenho. Antes de podermos entender a diferença entre os dois mecanismos de armazenamento, precisamos entender o termo “bloqueio”.

O que é o bloqueio no MySQL?


Para proteger a integridade dos dados armazenados nos bancos de dados, o MySQL emprega bloqueio. Bloquear, simplesmente, significa proteger os dados de serem acessados. Quando um bloqueio é aplicado, os dados não podem ser modificados, exceto pela consulta que iniciou o bloqueio. O bloqueio é um componente necessário para garantir a precisão das informações armazenadas. Cada mecanismo de armazenamento tem um método diferente de bloqueio usado. Dependendo de seus dados e práticas de consulta, um mecanismo pode superar o outro. Nesta série, veremos os dois tipos mais comuns de travamento empregados por nossos dois mecanismos de armazenamento.

Bloqueio de tabela: A técnica de bloquear uma tabela inteira quando uma ou mais células dentro da tabela precisam ser atualizadas ou excluídas. O bloqueio de tabela é o método padrão empregado pelo mecanismo de armazenamento padrão, MyISAM.
Exemplo:bloqueio de tabela MyISAM Coluna A Coluna B Coluna C
Atualização da consulta 1 Linha 1 Escrevendo dados dados
Consulta 2 SELECT (Aguarde) Linha 2 dados dados dados
Atualização da consulta 3 (Aguarde) Linha 3 dados dados dados
Consulta 4 SELECT (Aguarde) Linha 4 dados dados dados
Consulta 5 SELECT (Aguarde) Fila 5 dados dados dados
O exemplo ilustra como uma única operação de gravação bloqueia a tabela inteira, fazendo com que outras consultas aguardem a conclusão da consulta UPDATE.

Bloqueio em nível de linha: O ato de bloquear um intervalo efetivo de linhas em uma tabela enquanto uma ou mais células dentro do intervalo são modificadas ou excluídas. O bloqueio em nível de linha é o método usado pelo mecanismo de armazenamento InnoDB e destina-se a bancos de dados de alto desempenho.
Exemplo:bloqueio em nível de linha do InnoDB Coluna A Coluna A Coluna A
Atualização da consulta 1 Linha 1 Escrevendo dados dados
Consulta 2 SELECT Linha 2 Leitura dados dados
Atualização da consulta 3 Linha 3 dados Escrevendo dados
Consulta 4 SELECT Linha 4 Leitura Leitura Ler
Consulta 5 SELECT Fila 5 Leitura dados Ler
O exemplo mostra como usar o bloqueio em nível de linha permite que várias consultas sejam executadas em linhas individuais, bloqueando apenas as linhas que estão sendo atualizadas em vez de toda a tabela.

MyISAM vs. InnoDB


Ao comparar os dois mecanismos de armazenamento, chegamos ao ponto crucial do argumento entre usar o InnoDB em vez do MyISAM. Um aplicativo ou site que tenha uma tabela usada com frequência funciona excepcionalmente bem usando o mecanismo de armazenamento InnoDB, resolvendo gargalos de bloqueio de tabela. No entanto, a questão de usar um sobre o outro é subjetiva, pois nenhum deles é perfeito em todas as situações. Existem pontos fortes e limitações para ambos os mecanismos de armazenamento. O conhecimento íntimo da estrutura do banco de dados e das práticas de consulta é fundamental para selecionar o melhor mecanismo de armazenamento para suas tabelas.

O MyISAM irá superar o InnoDB em tabelas grandes que exigem muito mais atividade de leitura versus atividade de gravação. A legibilidade do MyISAM supera o InnoDB porque bloquear a tabela inteira é mais rápido do que descobrir quais linhas estão bloqueadas na tabela. Quanto mais informações na tabela, mais tempo o InnoDB leva para descobrir quais não estão acessíveis. Se o seu aplicativo depende de tabelas enormes que não alteram os dados com frequência, o MyISAM superará o InnoDB. Por outro lado, o InnoDB supera o MyISAM quando os dados dentro da tabela mudam com frequência. As alterações de tabela gravam mais dados do que lêem dados por segundo. Nessas situações, o InnoDB pode acompanhar grandes quantidades de solicitações com mais facilidade do que bloquear a tabela inteira para cada uma.

Devo usar o InnoDB com sites WordPress, Magento ou Joomla?


A resposta curta aqui é sim, na maioria dos casos. Os humanos mais úteis da Liquid Web nas equipes de suporte de hospedagem encontraram vários gargalos de bloqueio de tabela quando os clientes estão usando alguns aplicativos da Web padrão de hoje. A maioria dos usuários de aplicativos populares de terceiros, como WordPress, Magento e Joomla, tem conhecimento limitado dos componentes de banco de dados subjacentes ou do código envolvido para tomar uma decisão informada sobre os mecanismos de armazenamento. A maioria dos gargalos de bloqueio de tabela desses sistemas de gerenciamento de conteúdo (CMS) geralmente são resolvidos alterando todas as tabelas do site para InnoDB em vez do MyISAM padrão. Se você estiver hospedando muitos desses tipos de CMS em seu servidor, seria benéfico alterar o mecanismo de armazenamento padrão no MySQL para usar o InnoDB para todas as novas tabelas, para que qualquer nova instalação de tabela comece com o InnoDB.

Configurando o mecanismo de armazenamento padrão


Defina seu mecanismo de armazenamento padrão como InnoDB adicionando default_storage_engine=InnoDB para o [mysqld] seção do arquivo de configuração do sistema localizado em: /etc/my.cnf. Reiniciar o serviço MySQL é necessário para que o servidor detecte alterações no arquivo.

~ $ cat /etc/my.cnf
[mysqld]
log-error=/var/lib/mysql/mysql.err
innodb_file_per_table=1
default-storage-engine=innodb
innodb_buffer_pool_size=128M

Convertendo todas as tabelas entre MyISAM e InnoDB


Infelizmente, o MySQL não tem inerentemente uma opção para converter tabelas, deixando cada tabela para ser alterada individualmente. A equipe de suporte da Liquid Web montou um plano de manutenção fácil de seguir para esse processo. O script, que você pode executar no servidor necessário via acesso ao shell (SSH), converterá todas as tabelas entre os mecanismos de armazenamento.
Observe o planejamento de acordo ao realizar operações em lote dessa natureza apenas no caso de ocorrer um tempo de inatividade. A melhor prática é fazer backup de todos os seus bancos de dados MySQL antes de implementar uma mudança dessa magnitude, isso fornece um ponto de recuperação fácil para evitar qualquer perda de dados.
Etapa 1:  Preparação

Planeje começar em um horário do dia em que o tempo de inatividade tenha consequências mínimas. Este processo em si não requer nenhum tempo de inatividade, no entanto, o tempo de inatividade pode ser necessário para se recuperar de circunstâncias imprevistas.

Etapa 2:  Fazer backup de todos os bancos de dados em um arquivo

O comando abaixo cria um único backup de arquivo de todos os bancos de dados chamado all-databases-backup.sqld e pode ser excluído assim que a conversão for bem-sucedida e não houver problemas aparentes.
mysqldump --all-databases > all-databases-backup.sql

Etapa 3:  Gravar mecanismos de tabela existentes em um arquivo

Execute o script a seguir para registrar os mecanismos de tabela existentes em um arquivo chamado table-engine-backup.sql . Você pode então "importar" ou "executar" este arquivo mais tarde para converter de volta para seus mecanismos originais, se necessário.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=",Engine,";") FROM information_schema.tables WHERE table_schema NOT IN("mysql","information_schema","performance_schema");' | tee table-engine-backup.sql

Se você precisar reverter os mecanismos de tabela por qualquer motivo, execute:
mysql < table-engine-backup.sql

Etapa 4a:  Converter tabelas MyISAM para InnoDB

O comando abaixo continuará mesmo se uma tabela falhar e permitirá que você saiba quais tabelas falharam na conversão. A saída é salva no arquivo chamado convert-to-innodb.log para revisão posteriorw.
mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=InnoDB;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "MyISAM";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-innodb.log

Etapa 4b:Converter todas as tabelas InnoDB para MyISAM

Este comando continuará mesmo se uma tabela falhar e permitirá que você saiba quais tabelas falharam na conversão. A saída também é salva no arquivo chamado convert-to-myisam.log para posterior revisão.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=MyISAM;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "InnoDB";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-myisam.log

Convertendo uma única tabela entre MyISAM e InnoDB


Os comandos a seguir ilustram como a conversão de uma única tabela é realizada.
ObservaçãoSubstitua database_name pelo nome de banco de dados apropriado e table_name pelo nome de tabela correto. Certifique-se de ter um backup válido da tabela em questão antes de continuar.
Fazer backup de uma única tabela em um arquivo
mysqldump database_name table_name > backup-table_name.sql

Converter uma única tabela em InnoDB

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=InnoDB;’

Converter uma única tabela para MyISAM:

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=MyISAM;’

Confira nossos outros artigos desta série, Desempenho do MySQL:identificando consultas longas, para identificar consultas lentas em seu banco de dados. Fique atento ao nosso próximo artigo, onde abordaremos o armazenamento em cache e a otimização.
Navegação da série<>