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 arquivo
my.cnf
com 0. O
InnoDB
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 o InnoDB
utiliza é a
função fdatasync
. Se você não estiver
satisfeito com o desempenho da escrita do banco de dados,
você pode tentar configurar
innodb_flush_method
em
my.cnf
com O_DSYNC
,
embora O_DSYNC
pareça ser mais lento em
alguns sistemas.
Ao importar dados para o InnoDB
, esteja
certo de que o MySQL não está com
autocommit=1
ligado. Assim cada
inserção exige uma descarga de log em disco. Coloque antes
da linha de importação de arquivo do SQL
SET 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 tabela
InnoDB
, mesmo sem colocá-los entre
SET 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 dados
InnoDB
.
Tome ciência também de outras grandeas operações com
limite de disco. Use DROP TABLE
ou
TRUNCATE
(a partiir do MySQL-4.0) para
esvaziar uma tabela, não DELETE 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
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.