Pular para o conteúdo principal

Questão de Banco de Dados — MySQL — INSTITUTO AOCP 2024

Banco de DadosMySQL
Código
qa630651
Banca
INSTITUTO AOCP
Órgão
MGI
Ano
2024
Cargo
Esp ( )
Uma empresa de e-commerce deseja melhorar o desempenho de suas consultas em um banco de dados MySQL 8, com grande volume de dados de pedidos. O analista de banco de dados precisa implementar uma estratégia para otimizar o acesso aos dados.   Nesse caso, qual das estratégias a seguir seria a mais apropriada?
  1. ACriar índices agrupados em todas as colunas de chave estrangeira.
  2. BParticionar a tabela de pedidos por faixas de datas.
  3. CConverter todas as tabelas para o mecanismo de armazenamento MyISAM.
  4. DDesnormalizar o modelo de dados, combinando várias tabelas em uma única tabela.
  5. EUtilizar o recurso de Janelas e Funções Analíticas para simplificar consultas complexas.
Revelar gabarito e comentário

GabaritoB — Particionar a tabela de pedidos por faixas de datas.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Particionamento de tabelas no MySQL

Gabarito: letra B. Para otimizar consultas em uma tabela de pedidos com grande volume de dados, a estratégia mais apropriada é particionar a tabela por faixas de datas, pois isso permite que o MySQL acesse apenas as partições relevantes para a consulta, reduzindo drasticamente a quantidade de dados varridos. Essa técnica é especialmente eficaz quando as consultas filtram por um intervalo de datas, como é comum em sistemas de e-commerce.

O particionamento é uma técnica de otimização física que divide uma tabela lógica em segmentos menores, chamados partições, com base em um critério definido, como faixa de valores, lista ou hash. No MySQL, o particionamento por faixa (RANGE) é particularmente útil para dados temporais, pois cada partição pode armazenar um período específico (ex.: um mês, um trimestre). Quando uma consulta filtra por data, o otimizador pode realizar a poda de partições (partition pruning), lendo apenas as partições que contêm os dados solicitados, em vez de varrer a tabela inteira. Isso reduz o I/O e melhora o tempo de resposta, além de facilitar a manutenção, como arquivar partições antigas.

A escolha da estratégia de otimização depende do padrão de acesso aos dados. No cenário de e-commerce, as consultas mais comuns envolvem buscar pedidos por período (ex.: relatórios de vendas do último mês, análise de tendências). O particionamento por data alinha-se perfeitamente a esse padrão. Outras técnicas, como indexação, são úteis para acelerar buscas por valores específicos, mas não resolvem o problema de varrer grandes volumes de dados históricos. A desnormalização pode melhorar a leitura, mas aumenta a redundância e a complexidade de manutenção. Converter para MyISAM é uma regressão, pois esse mecanismo não suporta transações e é obsoleto. Funções de janela são recursos de consulta, não de armazenamento físico.

É importante entender que o particionamento não é uma solução universal. Ele deve ser planejado com base no padrão de consultas e na distribuição dos dados. No MySQL, o particionamento é suportado apenas em tabelas InnoDB e MyISAM, mas o InnoDB é o recomendado por oferecer suporte a transações e integridade referencial. Além disso, a chave de particionamento deve ser escolhida com cuidado: se as consultas não filtram pela coluna de particionamento, o particionamento pode até piorar o desempenho, pois o otimizador precisará acessar todas as partições.

A pegadinha desta questão está em distinguir as técnicas de otimização que atuam em níveis diferentes: índices e particionamento são estruturas físicas; desnormalização é uma alteração no modelo lógico; MyISAM é uma escolha de mecanismo de armazenamento; e funções de janela são recursos de consulta. A banca espera que o candidato identifique qual técnica ataca diretamente o problema de volume de dados com filtro por data.

Critério

Particionamento por data (B)

Índices em FKs (A)

MyISAM (C)

Desnormalização (D)

Funções de janela (E)

Nível de atuação

Físico (armazenamento)

Físico (estrutura de acesso)

Mecanismo de armazenamento

Lógico (modelo de dados)

Consulta (processamento)

Efeito sobre varredura de grandes volumes

Reduz drasticamente via poda de partições

Não reduz; apenas acelera buscas pontuais

Não reduz; mantém varredura completa

Pode reduzir joins, mas aumenta redundância

Não reduz; processa todo o conjunto

Adequação ao filtro por período

Alta (alinhada ao padrão de consultas)

Baixa (não resolve filtro por faixa)

Nenhuma

Média (depende do modelo)

Nenhuma (não é otimização física)

Impacto em escritas/concorrência

Baixo (manutenção por partição)

Alto (índices em excesso encarecem escritas)

Crítico (sem transações/row-level locking)

Alto (risco de inconsistência)

Nenhum (apenas leitura)

Suporte no MySQL 8

Sim (InnoDB/MyISAM)

Sim (InnoDB)

Obsoleto (regressão)

Sim (manual)

Sim (recurso de consulta)

Alternativa A — ❌ Incorreta

Criar índices agrupados em todas as colunas de chave estrangeira não é uma boa prática. Índices agrupados (clustered) no MySQL são implementados apenas no InnoDB, e a tabela só pode ter um índice agrupado (a chave primária). Criar índices em todas as FKs pode acelerar joins, mas não resolve o problema de varrer grandes volumes de dados por faixa de datas. Além disso, índices em excesso aumentam o custo de escrita e o espaço em disco. O correto seria criar índices seletivos nas colunas mais usadas em filtros e joins, não em todas as FKs.

Alternativa B — ✅ Correta ⟵ GABARITO

Particionar a tabela de pedidos por faixas de datas é a estratégia mais apropriada para o cenário descrito. Com o particionamento por RANGE na coluna de data, o MySQL pode realizar a poda de partições, lendo apenas as partições que contêm os dados do período consultado. Isso reduz drasticamente o I/O e melhora o desempenho das consultas que filtram por data, que são típicas em sistemas de e-commerce. Além disso, facilita a manutenção, como arquivar partições antigas.

Alternativa C — ❌ Incorreta

Converter todas as tabelas para o mecanismo de armazenamento MyISAM é uma regressão. O MyISAM não suporta transações (ACID), nem chaves estrangeiras, nem recuperação de falhas robusta. Embora tenha sido popular no passado, é inadequado para aplicações de e-commerce que exigem integridade e concorrência. O InnoDB é o mecanismo padrão e recomendado no MySQL 8, oferecendo suporte a transações, row-level locking e melhor desempenho em cargas de trabalho mistas.

Alternativa D — ❌ Incorreta

Desnormalizar o modelo de dados, combinando várias tabelas em uma única, pode melhorar a leitura em alguns casos, mas não é a estratégia mais apropriada para o cenário. A desnormalização introduz redundância, aumenta o risco de inconsistência e dificulta a manutenção. Em um sistema de e-commerce, onde há muitas escritas (novos pedidos, atualizações), a desnormalização pode piorar o desempenho geral. O particionamento é uma solução mais cirúrgica e menos invasiva.

Alternativa E — ❌ Incorreta

Utilizar o recurso de Janelas e Funções Analíticas para simplificar consultas complexas é uma técnica de consulta, não de otimização de armazenamento. Funções de janela (ex.: ROW_NUMBER, SUM OVER) são úteis para cálculos analíticos, mas não reduzem o volume de dados lidos do disco. Elas podem até aumentar o custo de processamento se aplicadas sobre grandes conjuntos de dados. A otimização de desempenho deve focar em reduzir o I/O, como faz o particionamento.

Gabarito: letra B

Link permanente: /questoes/qa630651