Como melhorar o desempenho do MySQL em servidores Linux
O desempenho de um banco de dados frequentemente decide sobre a velocidade e a estabilidade das aplicações web. MariaDB e MySQL oferecem várias possibilidades de otimização: desde configuração, passando por índices, até caching e replicação. Com medidas específicas, é possível usar os recursos do banco de dados de forma mais eficiente e reduzir significativamente os tempos de resposta para consultas.
Por que otimizar MySQL e MariaDB
A otimização de MariaDB e MySQL é sensata porque bancos de dados não otimizados chegam a seus limites rapidamente. Um desempenho ruim pode levar a tempos de carregamento longos demais, a timeouts ou até mesmo a falhas no sistema.
Além disso, em caso de grandes volumes de dados ou muitos acessos simultâneos, cada consulta pode sobrecarregar a CPU e a memória RAM. O armazenamento de dados redundantes ou a falta de índices também afetam negativamente a velocidade. Um banco de dados otimizado reduz a carga do sistema, melhora a escalabilidade e garante que as aplicações funcionem de maneira estável, mesmo sob alta carga.
Como otimizar o MySQL e o MariaDB
Existem muitas maneiras de otimizar um banco de dados MariaDB ou MySQL em um servidor Linux. Isso inclui ajustes na configuração, otimização de índices, melhorias nas consultas, tuning do InnoDB e uso de caching ou replicação. A seguir, são apresentadas as principais medidas.
Opção 1: identificar consultas lentas
Parte do processo para otimizar MySQL e MariaDB é verificar consultas lentas ou ineficientes. Uma consulta mal estruturada em MySQL ou em MariaDB pode reduzir o desempenho de toda a base de dados.
O MySQL e o MariaDB podem ser configurados para registrar todas as consultas que demorem mais do que o número especificado de segundos. Dessa forma, você pode acompanhar todas as consultas lentas e corrigi-las, se necessário.
Para ativar o registro de consultas lentas, acesse o MySQL/MariaDB:
mysql -u root -pDigite o seguinte comando para ativar o registro:
SET GLOBAL slow_query_log = 'ON';O limite padrão é de 10 segundos. Use o comando a seguir para ativar o registro para cada consulta que demore mais de 1 segundo:
SET GLOBAL long_query_time = 1;Consultas que demorarem mais de 1 segundo serão registradas em /var/lib/mysql/hostname-slow.log.
Ferramentas de monitoramento como mysqltuner ou performance_schema também podem ser utilizadas e fornecem dicas valiosas para reconhecer quais consultas podem ser otimizadas.
Opção 2: ajustar configuração do InnoDB
A configuração do MariaDB e do MySQL é um dos métodos mais eficazes para melhorar desempenho de forma sustentável. Muitas configurações padrão usam valores genéricos, projetados para ambientes de teste menores, mas não para sistemas produtivos com muitas consultas. Ajustar os parâmetros do InnoDB de forma direcionada pode permitir que o banco de dados utilize os recursos de maneira mais eficiente.
Parâmetros importantes incluem, entre outros:
innodb_flush_log_at_trx_commit: essa configuração oferece um commit considerável em relação a desempenho e confiabilidade. Por padrão, o valor é 1, o que significa que cada transação é imediatamente escrita no disco. Isso garante máxima segurança, mas pode reduzir significativamente o desempenho com alta carga de transações. Um valor de 2 reduz bastante as operações de I/O, enquanto há um risco baixo de perda de dados em caso de falha.innodb_log_file_size: o tamanho dos arquivos de log do InnoDB tem impacto direto na velocidade das operações de gravação. Arquivos de log maiores significam que mais transações podem ser acumuladas na memória antes de serem escritas no disco.innodb_file_per_table: com essa opção, um arquivo de tablespace separado é criado para cada tabela InnoDB. Isso oferece várias vantagens: facilita o gerenciamento de tabelas grandes, reduz a fragmentação dentro do tablespace comum e pode melhorar o desempenho durante backups.innodb_buffer_pool_size: esse valor deve representar entre 50 a 80% da memória RAM disponível para manter o máximo possível de dados e índices na memória.innodb_flush_method: esta opção determina como o InnoDB grava dados e logs no disco. Defina esse valor comoO_DIRECTpara evitar a dupla memorização em buffer dos dados.
Para alterar as configurações do InnoDB, abra o arquivo my.cnf para edição. Uma configuração em my.cnf poderia, por exemplo, ser assim:
[mysqld]
innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 512M
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
innodb_flush_method = O_DIRECTReinicie o MariaDB/MySQL para que as alterações entrem em vigor.
Opção 3: ajustar índices
Os índices são essenciais para melhorar o desempenho do MySQl ou das consultas MariaDB. Em vez de buscar cada linha de uma tabela, o banco de dados pode usar o índice para ir diretamente aos registros relevantes.
No entanto, muitas vezes ou índices incorretos podem ser contraproducentes. Cada índice adicional requer espaço de armazenamento. Portanto, é importante indexar apenas as colunas que realmente são usadas com frequência.
Um exemplo simples: Suponha que temos uma tabela users e frequentemente buscamos pela coluna email. Nesse caso, um índice pode acelerar consideravelmente as consultas:
CREATE INDEX idx_user_email ON users(email);Com esse índice, consultas como
SELECT * FROM users WHERE email='xyz@example.com';Podem ser executadas muito mais rapidamente, porque o banco de dados não precisa procurar em cada linha da tabela, mas acessa diretamente os registros correspondentes.
Além disso, índices combinados podem ser úteis quando várias colunas são frequentemente usadas juntas em consultas.
Você deve remover regularmente índices que não são mais necessários ou raramente utilizados para economizar espaço e melhorar o desempenho de escrita. No exemplo, o índice idx_old_column é excluído:
DROP INDEX idx_old_column ON users;Opção 4: otimizar consultas
Consultas SQL complexas ou ineficientes podem sobrecarregar o banco de dados e piorar a performance, especialmente em tabelas grandes. Para otimizar consultas, você deve primeiro verificar como o banco de dados executa a consulta. Para isso, o comando EXPLAIN é útil.
EXPLAIN SELECT id, email FROM users WHERE status='active';Com EXPLAIN, o MySQL e o MariaDB mostram quais índices são usados, quantas linhas precisam ser lidas e em que ordem as tabelas são processadas. Assim, você pode ver se a consulta é eficiente ou se otimizações adicionais são necessárias, como adicionar índices ou ajustar joins.
Evite consultas do tipo SELECT *, pois isso carrega muitas colunas que não são necessárias. Em vez disso, consulte apenas as colunas que realmente precisa. Isso reduz a quantidade de dados transferidos e melhora a velocidade da consulta. Em joins complexos, vale a pena formular as condições na cláusula WHERE de forma precisa, para evitar varreduras desnecessárias de toda a tabela.
Empresas de médio e grande porte optam pela nuvem da Alemanha. Serviços IaaS e PaaS são para campeões.
- Seguro
- Confiável
- Flexível
Opção 5: replicação e caching
A replicação, ou seja, a distribuição da carga em vários servidores, bem como o caching, para reduzir o número de acessos diretos ao banco de dados, podem ajudar a otimizar o desempenho do MariaDB e do MySQL.
Na replicação, geralmente é utilizado o chamado princípio master-slave: o servidor master processa todas as operações de escrita, enquanto um ou mais servidores slave replicam os dados e assumem consultas de leitura. Assim, o banco de dados pode lidar com alta carga de forma mais eficiente, sem sobrecarregar o servidor master. A configuração e a implementação da replicação requerem um esforço inicial, mas trazem uma melhoria de desempenho, especialmente em aplicações com alta utilização.
Além disso, o Caching pode melhorar significativamente os tempos de resposta. O MySQL/MariaDB oferece o Query Cache, que armazena em cache os resultados de consultas frequentemente repetidas. Dessa forma, as mesmas consultas não precisam ser executadas novamente. Com as configurações a seguir, você pode definir o tamanho do cache e ativar o Query Cache:
SET GLOBAL query_cache_size = 64*1024*1024;
SET GLOBAL query_cache_type = 1;Para aplicações modernas, também é aconselhável utilizar soluções de caching externas, como o Redis, que podem acessar dados frequentemente necessários com ainda mais rapidez.
Opção 6: particionamento de tabelas
Em tabelas muito grandes, o processamento de consultas pode demorar mais, pois o banco de dados precisa pesquisar cada linha. Com o particionamento, as tabelas podem ser divididas em partes menores e logicamente separadas, como por data, intervalo de ID ou outros critérios. Cada partição é tratada internamente como uma tabela separada, permitindo que consultas que envolvem apenas certas partições sejam executadas mais rapidamente.
Um exemplo de particionamento por ano em uma tabela de pedidos poderia ser assim:
CREATE TABLE orders (
id INT,
order_date DATE,
amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);Nesse caso, todos os pedidos de 2023 serão armazenados na partição p2023 e todos os pedidos de 2024 em p2024.
Opção 7: utilizar pooling de conexões
Cada nova conexão com MySQL/MariaDB requer tempo e recursos. Se a sua aplicação estabelece e encerra uma conexão a cada solicitação, isso gera uma carga desnecessária no servidor. O chamado pooling de conexões pode ser utilizado para otimizar MySQL e MariaDB, resolvendo esse problema ao manter um número específico de conexões de banco de dados permanentemente abertas. As aplicações então reutilizam essas conexões existentes, em vez de criar novas.
Um exemplo em PHP com mysqli é assim:
$mysqli = new mysqli('localhost', 'user', 'password', 'db');
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);phpEm vez de abrir uma nova conexão para cada requisição, o pool utiliza as conexões já existentes. Isso leva a tempos de resposta mais rápidos e, ao mesmo tempo, alivia o servidor de banco de dados.

