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 ?
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)…
Í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…
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…
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!
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.
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.
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.
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.