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

Melhorando o desempenho do MySQL com configurações avançadas do InnoDB

Discutimos como configurar o InnoDB para alto desempenho há algum tempo, no entanto, ainda não discutimos como podemos melhorar o desempenho do MySQL usando configurações avançadas do InnoDB. Esta postagem no blog deve fornecer um pouco mais de visão sobre esse tópico.

InnoDB explicado

Antes de nos aprofundarmos nas configurações do InnoDB, provavelmente devemos entender o básico:o InnoDB é um mecanismo de armazenamento para MySQL, MariaDB e Percona Server. O mecanismo era conhecido como InnoDB Plugin, que requer configuração e instalação do plugin. Até o lançamento do MySQL 5.5.5, o InnoDB não é mais um plugin e agora faz parte do pacote MySQL como um dos mecanismos de armazenamento suportados pelo MySQL. Desde o lançamento do MySQL 5.6, o InnoDB se tornou o mecanismo de armazenamento padrão - é um mecanismo de armazenamento de uso geral que equilibra alta confiabilidade e alto desempenho. As principais vantagens do InnoDB incluem suporte a bloqueio em nível de linha, chaves estrangeiras e seguir o modelo ACID (Atomicity Consistency Isolation Durability) - ACID é um conjunto de propriedades destinadas a garantir a validade dos dados apesar de erros, falhas de energia e outros problemas. O InnoDB possui uma extensa lista de variáveis ​​e algumas delas ajudam a melhorar o desempenho principalmente no tipo de hardware e recursos disponíveis do seu servidor de banco de dados. Entre estes estão:

  • innodb_data_file_path é o arquivo onde os dados das tabelas InnoDB são armazenados.
  • innodb_buffer_pool_size é um buffer de memória que o InnoDB usa para armazenar dados e índices de suas tabelas em cache.
  • innodb_log_file_size descreve o tamanho dos arquivos de log do InnoDB. Quanto maior o innodb_log_file_size, maior será o tempo de recuperação necessário em caso de falha.
  • innodb_log_buffer_size é usado pelo InnoDB para gravar nos arquivos de log no disco.
  • innodb_flush_log_at_trx_commit controla o equilíbrio entre desempenho e conformidade com ACID. O valor padrão é 1, o que ajuda a manter a conformidade do InnoDB ACID - transformar innodb_flush_log_at_trx_commit em 2 obtém uma velocidade de gravação muito rápida, mas até um segundo de transações pode ser perdido.

Há também configurações avançadas do InnoDB que podem ser definidas para melhorar ainda mais o desempenho do MySQL. Vamos dar uma olhada neles agora.

Configurações avançadas do InnoDB

Como já mencionado acima, o InnoDB possui configurações avançadas que podem ser usadas para melhorar ainda mais o desempenho dele (não listaremos absolutamente todas elas, mas as configurações listadas devem fornecer uma boa ideia de quão poderoso o InnoDB realmente é):

  • O InnoDB pode ser desabilitado - se você quiser desabilitar o InnoDB, simplesmente modifique o arquivo my.cnf e adicione skip-innodb na seção [mysqld]. Depois disso, reinicie seu servidor MySQL - o InnoDB agora deve estar desabilitado. Alternativamente, você pode usar a opção --innodb:configurá-la para OFF desativa o mecanismo. No entanto, observe que essas opções estão obsoletas a partir do MySQL 5.7.5.
  • O InnoDB também fornece um mecanismo de bloqueio configurável que pode melhorar o desempenho de instruções SQL que adicionam linhas a tabelas com colunas AUTO_INCREMENT:os modos de incremento automático podem ser configurados na inicialização usando a opção innodb_autoinc_lock_mode. A opção tem três configurações para especificar o modo de bloqueio - o modo de bloqueio pode ser 0 (“tradicional”), 1 (“consecutivo”) ou 2 (“intercalado”). Os valores oferecem desempenho dependendo do tipo de inserção do banco de dados. Resumindo, 0 oferece compatibilidade com versões mais antigas do MySQL e Innodb. O valor de 1 oferece mais segurança e abordagem determinística para replicação baseada em instrução (SBR). Enquanto o valor 2 tem o modo de bloqueio mais escalável e rápido, as linhas inseridas por qualquer instrução podem não ser consecutivas. Consulte a documentação do MySQL para obter mais informações.
  • O InnoDB oferece a capacidade de dividir o pool de buffers em vários segmentos (o recurso está disponível apenas no MySQL 5.5) - a configuração innodb_buffer_pool_instances permite melhorar a escalabilidade do MySQL em máquinas que executam vários núcleos. Por padrão, o valor dessa configuração é 1 se o innodb_buffer_pool_size for menor que 1 GB e 8 caso contrário:o número especifica o número de regiões em que o buffer pool do InnoDB é dividido. Essa configuração pode ser usada para envolver mais núcleos, explicaremos como mais tarde.
  • O InnoDB oferece quatro níveis de isolamento de transação (tx_isolation em <5.7, mas transaction_isolation na versão 5.7 em diante):READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ e SERIALIZABLE:esses níveis de isolamento são o "I" na sigla ACID :
    • Quando READ UNCOMMITTED está em uso, uma transação pode ver alterações não confirmadas por outra transação. Esse nível de isolamento permite leituras sujas.
    • Quando READ COMMITTED está em uso, você pode ter certeza de que todos os dados lidos foram confirmados no momento em que foram lidos.
    • Quando REPEATABLE READ está em uso, um nível de isolamento mais alto está em uso. Além de tudo o que é garantido pelo nível READ COMMITTED, ele também garante que nenhum dado que já foi lido não pode ser alterado.
    • Quando SERIALIZABLE está em uso, um nível de isolamento ainda maior está em uso. Além de tudo o que é garantido pelo nível de isolamento REPEATABLE READ, ele também garante que nenhum dado novo possa ser visto nas leituras subsequentes.
  • O InnoDB também permite definir a capacidade geral de E/S disponível para o InnoDB modificando a variável innodb_io_capacity. O valor dessa variável deve ser definido para aproximadamente o número de IOPS que o sistema pode realizar por segundo:ao definir o valor desse parâmetro, lembre-se de que valores em torno de 100 são mais apropriados para HDDs, enquanto SSDs podem se beneficiar de valores mais altos . A variável innodb_io_capacity_max também pode ser útil:esta variável permite que o InnoDB seja liberado de forma mais agressiva, o que significa que a taxa de operações de E/S pode exceder o limite definido por innodb_io_capacity - em tais situações, as operações não excederão o valor definido pela variável innodb_io_capacity_max .
  • O InnoDB também permite controlar quantos threads em segundo plano estão disponíveis para operações de E/S:o número de threads de E/S alocados para operações de leitura pode ser controlado pela variável innodb_read_io_threads enquanto o número de threads de E/S O threads alocados para operações de escrita podem ser controlados pela variável innodb_write_io_threads. O valor padrão para ambos os parâmetros é 4 e o valor máximo permitido é 64.
  • O InnoDB tem a capacidade de transformar certos avisos do InnoDB em erros:para isso, basta definir a variável innodb_strict_mode como ON:esta variável afeta o tratamento de erros de sintaxe para as operações CREATE TABLE, ALTER TABLE e CREATE INDEX :desabilitar esta variável pode resolver erros de “Tamanho da linha muito grande”. Para desativar o modo estrito, defina innodb_strict_mode como DESATIVADO.
  • O InnoDB pode ser um pouco protegido contra varreduras completas de tabela que interferem nos dados armazenados em cache no buffer pool aumentando a variável innodb_old_blocks_time. O valor mínimo para essa configuração é 0, o valor padrão é 1.000.
  • Se você executar operações de manutenção em tabelas InnoDB que contêm índices FULLTEXT, considere ativar a variável innodb_optimize_fulltext_only - depois que essa variável for habilitada, a consulta OPTIMIZE TABLE deverá ser executada mais rapidamente porque ignorará a reorganização dos dados na mesa. Observe que essa configuração deve ser ativada apenas temporariamente, portanto, convém desativá-la quando a otimização for concluída.
  • Para iniciar o InnoDB no modo somente leitura, habilite a configuração innodb_read_only. Quando esta configuração está habilitada, você pode consultar tabelas InnoDB onde o diretório de dados do MySQL está em mídia somente leitura.

Fazendo o InnoDB envolver mais núcleos

Você também pode fazer com que o InnoDB envolva mais núcleos aproveitando seus recursos de multithreading:surpreendentemente, isso não é muito difícil de conseguir - você só precisa modificar algumas configurações. Veja como fazer isso:

  1. Deixe a opção innodb_thread_concurrency em seu valor padrão 0. Ao fazer isso, você permite que o InnoDB decida o melhor número de tickets de simultaneidade (eles determinam o número de threads que podem entrar simultaneamente no InnoDB) para abrir para um determinado MySQL configuração da instância. Para o MariaDB a partir da versão 10.5, está marcado como obsoleto, então faria sentido para o MySQL definir isso como 0, pois os recursos de computação foram sofisticados em comparação com os primeiros dias do MySQL.
  2. Depois que a opção innodb_thread_concurrency for definida como 0, defina innodb_read_io_threads e innodb_write_io_threads com seus valores máximos de 64. Isso deve envolver mais núcleos.

Resumo


Para resumir, o InnoDB é um mecanismo de armazenamento extremamente poderoso. O desempenho desse mecanismo de armazenamento é afetado diretamente pelas configurações que esse mecanismo está usando. Portanto, se você deseja melhorar o desempenho de sua instância MySQL, lembre-se de pelo menos algumas das dicas mencionadas neste artigo. Ajustar as configurações em relação ao mecanismo e usá-las quando apropriado, fazendo isso deve lhe dar uma vantagem.