Perguntas Específicas de Função (Desenvolvedor, DBA, DevOps)
Desenvolvedor: Como você lida com problemas de consulta N+1 em sua aplicação ao interagir com o MySQL?
Resposta:
O problema de consulta N+1 ocorre ao buscar uma lista de registros pais e, em seguida, executar uma consulta separada para cada pai para buscar seus registros filhos relacionados. Eu resolvo isso usando operações JOIN (por exemplo, LEFT JOIN) para buscar todos os dados necessários em uma única consulta, ou usando mecanismos de eager loading fornecidos por ORMs para pré-buscar dados associados.
Desenvolvedor: Explique a diferença entre os tipos de dados CHAR e VARCHAR no MySQL.
Resposta:
CHAR é um tipo de string de comprimento fixo, preenchendo valores mais curtos com espaços até seu comprimento definido. É mais rápido para dados de comprimento fixo, mas pode desperdiçar espaço. VARCHAR é um tipo de string de comprimento variável, armazenando apenas os caracteres inseridos mais um byte de comprimento. É mais eficiente em termos de espaço para comprimentos de string variáveis, mas pode ser ligeiramente mais lento devido aos cálculos de comprimento.
DBA: Qual é o propósito do parâmetro innodb_buffer_pool_size e como você geralmente o dimensiona?
Resposta:
O parâmetro innodb_buffer_pool_size define a área de memória onde o InnoDB armazena em cache dados e índices. É crucial para o desempenho, pois reduz o I/O de disco. Eu geralmente o dimensiono para 50-80% da RAM disponível em um servidor MySQL dedicado, garantindo que haja memória suficiente para o sistema operacional e outros processos.
DBA: Descreva os passos que você tomaria para solucionar um problema de alta utilização de CPU em um servidor MySQL.
Resposta:
Eu começaria verificando SHOW PROCESSLIST para consultas de longa duração e SHOW ENGINE INNODB STATUS para contenção de mutex. Em seguida, analisaria a saída de pt-query-digest do log de consultas lentas para identificar consultas problemáticas. Finalmente, examinaria métricas de nível de sistema operacional (por exemplo, top, vmstat) para descartar problemas não relacionados ao MySQL.
DBA: Quando você escolheria usar uma PRIMARY KEY em vez de um índice UNIQUE?
Resposta:
Uma PRIMARY KEY identifica exclusivamente cada linha, impõe NOT NULL e só pode haver uma por tabela. É o índice clusterizado para tabelas InnoDB, ditando a ordem física de armazenamento. Um índice UNIQUE também impõe unicidade, mas permite valores NULL (múltiplos NULLs se não for explicitamente NOT NULL) e uma tabela pode ter múltiplos índices UNIQUE. Escolha PRIMARY KEY para o identificador principal, UNIQUE para outras restrições de unicidade.
DevOps: Como você automatiza backups do MySQL e garante sua recuperabilidade?
Resposta:
Eu automatizo backups usando mysqldump para backups lógicos ou Percona XtraBackup para backups físicos e "quentes" do InnoDB. Estes são agendados via cron jobs. Para garantir a recuperabilidade, os backups são armazenados fora do local, e eu realizo regularmente restaurações de teste em um ambiente separado para validar sua integridade e o processo de recuperação.
DevOps: Explique como você implementaria uma configuração de MySQL de alta disponibilidade.
Resposta:
Para alta disponibilidade, eu normalmente usaria MySQL Replication (Master-Slave ou Group Replication) para redundância de dados e failover. Um balanceador de carga (por exemplo, ProxySQL, HAProxy) ficaria na frente para direcionar o tráfego e lidar com a detecção de failover. Orchestrator ou MHA podem ser usados para gerenciamento automatizado de failover.
Resposta:
binlog_format determina como as alterações são gravadas no log binário. STATEMENT registra instruções SQL, ROW registra alterações em nível de linha e MIXED usa uma combinação. O formato ROW é geralmente preferido pela confiabilidade e para evitar problemas de replicação não determinísticos, especialmente com consultas complexas ou UDFs.
Desenvolvedor: Como você previne vulnerabilidades de SQL injection em sua aplicação?
Resposta:
Eu previno SQL injection usando consultas parametrizadas ou prepared statements. Isso separa o código SQL dos dados fornecidos pelo usuário, garantindo que a entrada seja tratada como valores literais em vez de código executável. ORMs geralmente lidam com isso automaticamente, mas é crucial estar ciente do mecanismo subjacente.
Resposta:
Eu uso EXPLAIN para analisar o plano de execução de uma consulta lenta. Eu procuro por type (por exemplo, ALL indica uma varredura completa da tabela, ref ou eq_ref são bons), rows (número de linhas examinadas), Extra (por exemplo, 'Using filesort', 'Using temporary') e se os índices estão sendo usados de forma eficaz. Isso ajuda a identificar índices ausentes ou ineficientes.
DevOps: Como você monitora o desempenho do MySQL em um ambiente de produção?
Resposta:
Eu monitoro o desempenho do MySQL usando uma combinação de ferramentas. Prometheus com MySQL Exporter fornece métricas como QPS, conexões, taxa de acerto do buffer pool. Percona Monitoring and Management (PMM) oferece insights detalhados sobre consultas, métricas do SO e status do InnoDB. Eu também configuro alertas para limites críticos como alta CPU, baixo espaço em disco ou consultas lentas.