Dicas de Ajuste de Desempenho
Se o aplicativo top
do Unix ou o Gerenciado de Tarefas
do Windows mostrar que percentual de uso da CPU com sua carga de trabalho é menor que 70%, provavelmente sua carga de trabalho está no limite do disco. Talvez você esteja fazendo muitos commits de transações ou a área de buffer é muito pequena. Tornar o buffer maior pode lhe ajudar, mas não o configure com mais de 80% da memória física.
- Envolva diversas modificações em uma transação. O
InnoDB
deve descarregar o log em disco a cada commit da transação se esta transação fizer modificações no banco de dados. Uma vez que o velocidade de rotação do disco é normalmente 167 revoluções/segundo, o número de commits fica limitado aos mesmos 167/segundo se o disco não enganar o sistema operacional. - Se você puder ter perda dos últimos commits feitos em transações, você pode configurar o parâmetro
innodb_flush_log_at_trx_commit
no arquivomy.cnf
com 0. OInnoDB
tenta descarregar o log uma vez por segundo de qualquer forma, embora a descarga não seja garantida. - Torne os seus arquivos de log maiores, tão grande quanto a área de buffer. Quando o
InnoDB
escrever o arquivo de log totalmente, ele terá que escrever o conteúdo modificado da área de buffer no disco em um ponto de verificação. Arquivos de log menores causarão muitos escrita desnecessárias em disco. O ponto negativo em arquivos grandes é que o tempo de recuperação será maior. - O buffer de log também deve ser grande, cerca de 8 MB.
- (Relevante para versão 3.23.39 e acima.) Em algumas versões do Linux e Unix, descarregar arquivos em disco com o comando
fdatasync
do Unix e outros métodos parecido é surpreendentemente lento. O método padrão que oInnoDB
utiliza é a funçãofdatasync
. Se você não estiver satisfeito com o desempenho da escrita do banco de dados, você pode tentar configurarinnodb_flush_method
emmy.cnf
comO_DSYNC
, emboraO_DSYNC
pareça ser mais lento em alguns sistemas. - Ao importar dados para o
InnoDB
, esteja certo de que o MariaDB não está comautocommit=1
ligado. Assim cada inserção exige uma descarga de log em disco. Coloque antes da linha de importação de arquivo do SQLSET AUTOCOMMIT=0;
e depois dele
COMMIT;
Se você utilizar a opção
mysqldump
--opt
, você obterá arquivos dump que são mais rápidos de importar também em uma tabelaInnoDB
, mesmo sem colocá-los entreSET AUTOCOMMIT=0; ... COMMIT;
. - Tome ciência dos grandes rollbacks de inserções em massa: o
InnoDB
utiliza o buffer de inserção para economizar E/S de disco em inserções, mas em um rollback correspondente tal mecanismo não é usado. Um rollback no limite de disco pode demorar cerca de 30 vezes mais que a insserção correspondente. Matar o processa de banco de dados não irá ajudar pois o rollback irá reiniciar ao se entrar no banco de dados. O único modo de se livrar de um rollback deste tipo é aumentar a área de buffer de forma que o rollback dependa do limite de CPU e seja executado rápidamente ou deltar todo o banco de dadosInnoDB
. - Tome ciência também de outras grandeas operações com limite de disco. Use
DROP TABLE
ouTRUNCATE
(a partiir do MariaDB-4.0) para esvaziar uma tabela, nãoDELETE FROM suatabela
. - Utilize
INSERT
multi-line para reduzir a sobrecarga de comunicação entre o cliente e o servidro se você precisar inserir muitas linhas:INSERT INTO suatabela VALUES (1, 2), (5, 5);
Esta dica é válida para inserções em qualquer tipo de tabela, não apenas no
InnoDB
.