Desempenho MySQL

Boa tarde galera do Guj.

Estou desenvolvendo uma aplicação Java e Mysql, estou com uma dúvida que não sei ao certo se me expressei da forma correta no título do tópico.
Então… essa aplicação tende a armazenar muita informações daqui uns anos… minha dúvida é relacionada ao desempenho em consultas SQL com tabelas com um grande número de linhas.

Quero entender em questão de números em relação ao desempenho, pra poder quem sabe codificar da forma correta os meus selects.
Um dos meus métodos é esse. Ele busca do banco e gera uma lista para popular meu TableModel

public List<compra> buscarCompraTableModel(String tipo) throws SQLException{

  listCompraTableModel = new ArrayList<>();
      
  String sql = "select * from compra inner join produto on produtoId = idProduto where tipo = ? and status = ? order by idCompra";
  
  PreparedStatement stm = con.prepareStatement(sql);
  stm.setString(1, tipo);
  stm.setString(2, "A");
  ResultSet rs = stm.executeQuery();
  
  try {
  
                while (rs.next())
                {
                    compra c = new compra();
                    
                    c.setData(rs.getDate("data"));
                    c.setIdCompra(rs.getInt("idCompra"));
                    c.setNomeProd(rs.getString("nome"));
                    c.setNnota(rs.getString("nNota"));
                    c.setQuant(rs.getDouble("quant"));
                    c.setValorKg(rs.getDouble("valorKg"));
                    c.setObs(rs.getString("obs"));
                    
                    listCompraTableModel.add(c);
                 
                }

                con.close();
                                 
                
            } catch (Exception e) {
}
  
  return listCompraTableModel;

}

Funciona perfeitamente, no entanto, estou pensando no futuro… quando tiver 1000 ou 50000 linhas na tabela… Como será o desempenho desse código? Existe um limite de armazenamento que não influencia no desempenho? E qual a melhor forma de codificar ?

Obrigado pela atenção de todos

Algumas coisas a considerar…

  1. Engines: MyISAM vs Innodb, MyISAM é aconselhado para tabelas que terão poucos inserts/updates (volume baixo de uma só vez) etcs mas muitos selects (mais performático)…

  2. Índices: os campos mais selecionados em cláusulas WHERE (ex: cpf, email, rg, nome, endereço, etc) são altamente recomendados tornarem-se indices para otimizar as consultas…

  3. Campos vs * no select: sim, isso faz diferença a longo prazo (principalmente tabela com dezenas de campos/colunas), especificar os campos que deseja mostrar ao invés de usar * pode melhorar a performance…

  4. Views: é um recurso que o mysql (e qualquer outro sgbd relacional) possui, e recomendados principalmente se vc tem muitos joins, podendo estar “empacotados” em uma unica chamada, OBS: views aceitam WHERE para refinar a consulta…

Esses são alguns pontos que lembro, vai pesquisando, bons estudos!

1 curtida

Obrigado pelas considerações rodevops :ok_hand:

Oi @rodevops,

De quando é esse conselho? Acho que há mais de 10 anos Myisam já nao é mais recomendado e o InnoDB tem performance semelhante. Também, MyIsam nao suporta transaçoes, o que pode ser um problema pior do que performance.

@RDev

Se você quer descobrir como seu sistema se comporta com um volume de dados maior, a maneira mais garantida de descobrir é testando. Gere dados na sua tabela até ter a quantidade de registros que está curioso e veja o que acontece.

2 curtidas

Obrigado pela correção, realmente estou um bom tempo afastado do mysql, por isso acabei informando coisas “no automatico” por assim dizer…

@RDev peço desculpas por passar informações ultrapassadas, gentileza atente-se às correções…

1 curtida

Entendi AbelBueno, obrigado.

Tudo certo Rodevops.

:smiley:

Tranquilo, isso é uma das maldiçoes da nossa área, do dia pra noite, tudo que a gente conhecia que era verdade, muda.

Desculpe o tom agressivo da mensagem.

1 curtida

Um puxão de orelha bem aplicado é sempre bemvindo e o bom desse fórum é o laboratório que proporciona, forte abraço!

Como já foi citado acima a prática de índices sempre proporciona um desempenho bacana, uma outra prática que geralmente se aplica a grandes massas de dados é o particionamento de tabelas, o que faz com que os dados sejam quebrados em blocos menores, proporcionando assim um desempenho otimizado, mas como tudo na tecnologia, depende de como está seu cenário atual e todos os N fatores que influenciam nisso, afinal, todas são boas práticas aplicáveis, porém nem sempre todo remédio colabora pra cura da mesma doença.

2 curtidas

Blz, por conta da sugestão de vcs, fiz a alteração no BD pra me retornar somente os índices (PK) do dado que eu quero… As tabelas eu acredito que já estejam bem particionadas Jonathan_Medeiros, Vlw.
Ainda irei fazer o teste adicionando milhares de linhas como disse o AbelBueno, e retornarei aqui sobre o que aconteceu.

Acho muito legal ter tantas pessoas dispostas a ajudar aqui, e sem qualquer tipo de incentivo financeiro eu acredito… Leio o Fórum quase que diariamente, e vejo a preocupação, disposição e paciência de muitas pessoas a ajudarem outras com menos conhecimento como eu. Por isso sempre que posso tento ajudar outros.

Obrigado galera