Otimizando as configurações padrão do InnoDB

8

Eu olhei para o my.ini e vi várias configurações padrão. Meu banco de dados está sendo executado em um único PC independente. Quero otimizar o desempenho do InnoDB e do MySQL em geral para desempenho. Não há restrição de espaço em disco. Quais configurações padrão devo alterar para otimizar para obter melhor desempenho, confiabilidade e possíveis backups pontuais [alta disponibilidade].

Editado

Atualmente, sempre que eu executo "Otimizar tabelas" via Manutenção no MySQL Administrator, ele mostra:

A tabela não suporta otimizar, ao invés de recriar + analisar

em todas as mesas. Todas as minhas tabelas são InnoDB, mas por que elas não suportam o Optimize?

RPK
fonte
que editar merece uma pergunta separada, imo. Dê uma olhada na documentação da OPTIMIZE TABLE: dev.mysql.com/doc/refman/5.5/en/optimize-table.html O InnoDB suporta o comando, mas o processo é diferente do MyISAM
Derek Downey

Respostas:

11

A maneira de ajustar o InnoDB é centrada em torno

  • InnoDB Buffer Pool: armazena em cache as páginas de dados e as páginas de índice. A quantidade de dados e índice que você pode armazenar em cache não é uma função das restrições de espaço em disco, mas uma função da memória e espaço em disco disponíveis atualmente usados ​​pelo InnoDB.
  • MetaData do InnoDB: Por padrão, o arquivo ibdata1 normalmente abriga tudo e qualquer coisa do InnoDB. Isso incluiria páginas de dados, páginas de índice, metadados da tabela, dados do MVCC .

Aqui está uma fórmula que eu usei nos últimos 5 anos para calcular o InnoDB Buffer Pool com base no espaço em disco usado pelos dados e páginas de índice do InnoDB :

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
  • Use (SELECIONAR 0 Power1024) para bytes
  • Use (SELECT 1 Power1024) para KB
  • Use (SELECT 2 Power1024) para MB
  • Use (SELECT 3 Power1024) para GB
  • Use (SELECT 4 Power1024) para TB (envie-me um e-mail se tiver TerraBytes de RAM)

Obviamente, eu disse uma função da memória e espaço em disco disponíveis atualmente usados ​​pelo InnoDB. A partir daqui, basta usar o bom senso. O número recomendado da consulta acima não deve exceder 75% da RAM instalada !!! Essa é a regra de ouro mais simples para dimensionar o InnoDB Buffer Pool.

Você também deve definir innodb_flush_method como O_DIRECT, pois ele fornecerá gravações síncronas estáveis ​​do InnoDB. Também escrevi um post sobre como otimizar o armazenamento em disco para o InnoDB .

Com relação à mensagem A tabela não suporta otimizar, ao invés de recriar + analisar , a razão pela qual você recebe essa mensagem de erro é o fato de o mecanismo de armazenamento ser o InnoDB. Mecanicamente, OPTIMIZE TABLE apenas copia a tabela para uma tabela temporária e executa ANALYZE TABLE .

Na realidade, ANALYZE TABLE contra o InnoDB é completamente inútil. Mesmo se você executou ANALYZE TABLE em uma tabela InnoDB, o mecanismo de armazenamento InnoDB executa mergulhos no índice para aproximações de cardinalidade repetidas vezes, destruindo assim as estatísticas que você acabou de compilar. De fato, a Percona realizou alguns testes no ANALYZE TABLE e também chegou à mesma conclusão .

Aqui estão outras postagens que fiz ao longo do ano sobre o InnoDB Tuning

RolandoMySQLDBA
fonte
Meu PC possui 2 GB de RAM e o InnoDB_Buffer_Pool_Size está definido por padrão como 6M. Eu aumentei para 500M. Alguma sugestão?
RPK
Defina-o 1536M, que é 1.5G, uma vez que representa 75% da RAM instalada.
RolandoMySQLDBA
Eu executei sua consulta, e dá uma saída 45G. A RAM do meu servidor é 8G. Eu precisaria absolutamente aumentar minha RAM? Ou existem algumas condições para a consulta acima ..
Stewie
@ Stewie Se você tem 45G de InnoDB, 60GB de RAM é o que você precisa se tiver o orçamento. Como você possui apenas 8G, 75% da RAM instalada (6G) é adequada.
RolandoMySQLDBA
@RolandoMySQLDBA: great post! Mas não entendo muito bem por que, no caso de Stewie, sua RAM é de apenas 8 GB, mas a saída de sua consulta pode ser maior que 8 GB (45 G neste caso.) Você poderia esclarecer?
Chubaka 17/08/19
3

Aqui está um artigo mais antigo sobre as variáveis ​​importantes para 'sintonia grossa'. O mais importante provavelmente sendoinnodb_buffer_pool_size

Eu recomendo atualizar para o MySQL 5.5 (se você ainda não o estiver executando). Eles fizeram algumas alterações no desempenho do InnoDB. Eles ainda fornecem uma seção principal sobre como otimizar o InnoDB agora que é o mecanismo padrão: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

Quanto aos backups point-in-time, convém consultar o log binário . O básico para habilitar isso é definir a log-binvariável no seu my.cnf

Derek Downey
fonte
Eu atualizei para o MySQL 5.5.
RPK
2

O Optimize vem em várias cores.

Acho que seu primeiro passo deve ser o de decidir o que "otimizar" significa para você. Para algumas pessoas, significa "consultas SELECT mais rápidas". Para outros, significa "melhor equilíbrio entre desempenho SELECT e desempenho INSERIR". Para outros, "desempenho mais rápido do INSERT".

Você precisa decidir quais são seus critérios e como informar se suas alterações serão úteis antes de iniciar o ajuste.

Em seguida, coloque seus arquivos de configuração e opções de inicialização sob controle de versão e comece a experimentar. Documento cujos conselhos você segue e onde os encontrou. (O conselho muda com o tempo, à medida que a base de código e o hardware mudam.) Coloque esses documentos sob controle de versão também.

Mike Sherrill 'Recolha de Gatos'
fonte