Estou executando um servidor MySQL 5.5 na minha estação de trabalho para análise de dados científicos e gostaria de saber como configurar o MySQL para obter o máximo proveito do desempenho. Os tipos de consulta que normalmente executo envolvem junções de 10 a 20 tabelas e podem ser executadas por um longo período, de um a vários minutos, não sendo exceção. Apenas muito poucos usuários acessam o banco de dados ao mesmo tempo (5 sendo o máximo). Mudei o servidor de um Lenovo Thinkpad T61 com um Dual Core de 2,2 GHz e 4 GB de RAM para a seguinte máquina totalmente nova com componentes selecionados manualmente:
- Intel i7 3770, 4x 3,4 GHz (rodando a 4x3,7 GHz)
- Chipset Z77
- 16 GB de RAM DDR3 1600
- Windows 7 Prof de 64 bits
- O servidor Windows e MySQL é executado em uma unidade SSD Intel série 520.
Os primeiros testes (executando a mesma consulta nas duas máquinas) mostraram uma melhoria definitiva na velocidade da nova, mas as consultas ainda demoram muito tempo e eu esperava mais um impulso. As consultas em questão são bastante otimizadas, ou seja, todas as tabelas possuem uma chave adequada que também está sendo usada como "explicação estendida".
Agora, para minhas configurações atuais do MySQL: Primeiro, devo mencionar que mudei do MyISAM para o Innodb há muito tempo.
Alguns dos meus ajustes do my.ini (ou seja, desvios das configurações padrão):
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system. Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M
general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries
Gostaria de saber se alguém sugeriria alterações nos números acima ou ainda outras configurações que eu não conheça.
Eu apreciaria qualquer observação útil.
Steve
EDIT: Eu tenho duas consultas envolvendo junções em 10 a 20 tabelas e as executei no meu notebook Lenovo e no novo PC. A consulta 1 levou 3m36s na nova máquina contra 9m11s no laptop; A consulta 2 levou 22,5 segundos na estação de trabalho e 48,5 segundos no laptop. Portanto, a velocidade de execução foi melhorada aproximadamente pelo fator 2-2,5. Na estação de trabalho, nem 50% da RAM foi usada. A carga média da CPU nos quatro núcleos (conforme relatado pelo Windows Task Manager) foi de apenas 13%. A carga por núcleo (conforme relatada pelo Core Temp) foi de 25 a 40% para UM núcleo, enquanto foi <= 10% para os outros, indicando que o MySQL não utiliza múltiplos núcleos para uma única consulta. .