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. .
Respostas:
Como você está executando o MySQL 5.5, convém configurar o InnoDB para acessar vários núcleos
Aqui estão as configurações que você deve usar
innodb_thread_concurrency define o limite superior do número de threads simultâneos que o InnoDB pode manter aberto. O melhor número de ronda definido para isso é (2 X Número de CPUs) + Número de Discos. ATUALIZAÇÃO : Como aprendi em primeira mão com a conferência Percona NYC, você deve definir isso como 0 para alertar o InnoDB Storage Engine para encontrar o melhor número de threads para o ambiente em que está executando.
innodb_concurrency_tickets define o número de encadeamentos que podem ignorar a verificação de simultaneidade com impunidade. Depois que esse limite é atingido, a verificação de simultaneidade de encadeamento se torna a norma novamente.
innodb_commit_concurrency define o número de transações simultâneas que podem ser confirmadas. Como o padrão é 0, não definir isso permite que qualquer número de transações seja confirmado simultaneamente.
innodb_thread_sleep_delay define o número de milissegundos que um encadeamento do InnoDB pode estar inativo antes de entrar novamente na fila do InnoDB. O padrão é 10000 (10 s).
innodb_read_io_threads e innodb_write_io_threads (ambos desde o MySQL 5.1.38) alocam o número especificado de threads para leituras e gravações. O padrão é 4 e o máximo é 64.
innodb_replication_delay impõe o atraso do encadeamento em um escravo quando innodb_thread_concurrency for atingido.
Aqui estão meus posts anteriores no MySQL 5.5 e ativando múltiplos núcleos para o InnoDB
Jun 01, 2012
: Eu tenho 16 GB de RAM, como devo configurar o MySQL Server?May 07, 2012
: Desempenho do servidor MySQLApr 26, 2012
: O desempenho da CPU é relevante para um servidor de banco de dados?Mar 16, 2012
: Usando múltiplos núcleos para consultas únicas do MySQL no DebianOct 07, 2011
: Devo usar um mecanismo de armazenamento diferente do MyISAM para otimizar essas tabelas ou devo obter discos melhores?Sep 20, 2011
: Multi cores e desempenho do MySQLSep 12, 2011
: Possível fazer o MySQL usar mais de um núcleo?fonte
O consultor líder do MySQL da Percona oferece um assistente de configuração do MySQL . Permite configurar
my.cnf/my.ini
dependendo da configuração do sistema.Além disso, o pessoal da Percona lançou um livro chamado " MySQL de alto desempenho ". A terceira edição foi lançada recentemente e aborda o ajuste em grandes detalhes.
fonte
Uso de memória: consulte http://mysql.rjweb.org/doc.php/memory (a maioria dos ajustáveis não fará diferença suficiente para importar.)
max_heap_table_size = 4000M é perigosamente alto! Se 4 usuários precisarem, você estará sem memória RAM e trocando. A troca prejudica o desempenho muito mais do que praticamente qualquer coisa.
Consultas que levam mais de alguns segundos: devem ser estudadas para melhorias; forneça SHOW CREATE TABLE; MOSTRAR ESTADO DA MESA; EXPLAIN SELECT
fonte
Você pode considerar outras opções também. Como o PostgreSQL no FreeBSD. Mas mudar do Windows para o Linux aumentará seu desempenho.
fonte