Consulta otimizada MySql Java

8 respostas
Soraynha

[size=18]Ola sou novata no mundo da programação, e estou com algumas dúvidas na aplicação que estou desenvolvendo. Trata-se de um sistema para biblioteca onde acontecem diversas consultas com bastante frequencia.Utilizo o banco de dados MySql e as principais consultas são:

consultar codigo, tipo, nome do item,nome da area, nome do autor, nome da prateleira e nome da editora da tabela acervo quando estes obedecerem a uma determinada condição.Os campos, com exeção do codigo e nome do item são chaves estrageiras referenciadas pelo id.

Consultar codigo, nome do acervo, nome do associado e data de emprestimo da tabela Emprestimos quando estes obedecerem a uma determinada regra, sendo que com exeção do codigo os demais campos são chaves estrangeiras.

Qual a melhor forma de realizar estas consultas (joins ou consultas simples), fazendo com que minha aplicação não fique lenta???
No caso de JOIN como montar os comandos SQL com tantas tabelas envolvidas???
[/size]
[color=darkblue]Desde já agradeço a colaboração[/color] :slight_smile:

8 Respostas

Eder_Peixoto

Olá Soraynha!

  1. No uso do SELECT, para aumentar a performance da consulta, é importante utilizar uma chave (não necessariamente a chave estrangeira).

  2. A sintaxe do JOIN é igual, seja para duas tabelas ou para um número maior.

  3. Saber o que é melhor, usar JOIN ou várias consultas simples (SELECT sem JOIN), dependerá de quantos SELECT simples seriam necessários a mais em relação ao uso do JOIN. Como já disse no item 1, o mais importante em um SELECT é o uso de uma “boa” chave.

Soraynha

Eder obrigada mesmo pela resposta não querendo abusar da boa vontade você poderia resolver uma das duas consultas para que eu possa ter um exemplo mais claro, como disse sou iniciante e minha maior dificuldade é o banco de dados!!!

wbdsjunior

Soraynha.

o que você já tem/tentou fazer?

poste o script de criação das tabelas.

Soraynha

Já implementei esse codigo de consulta. Tenho um metodo na minha classe de conexão que recebe os campos a serem retornados e nome da tabela seguida da condição where, este metodo me retorna um resultSet que eu utilizo para manipular o resultado da consulta. Só que como vocês podem ver é algo muito amador e acredito que isso vai me trazer problemas futuramente pois este banco foi preparado para receber uma grande quande quantidade de dados.

[size=18]//Verificando qual a opção de consulta

int  opConsulta=CBOpcao.getSelectedIndex();

switch(opConsulta){

case 1:

rst=(conn.executaConsulta("<em>",“acervo where area like '%” + jTextNomeBusca.getText()+"%’"));

break;

case 2:

rst=(conn.executaConsulta("</em>",“acervo where assuntos like '%” + jTextNomeBusca.getText()+"%’"));

break;

case 3:

rst=(conn.executaConsulta("<em>",“acervo where autor like '%” + jTextNomeBusca.getText()+"%’"));

break;

case 4:

rst=(conn.executaConsulta("</em>",“acervo where titulo like '%” + jTextNomeBusca.getText()+"%’"));

break;
}
//Passando o resultado da consulta para as variaveis

try{

while (rst.next())

{

codigo = rst.getInt(1);

idTipo=rst.getInt(2);

titulo=rst.getString(6);

idArea=rst.getInt(7);

idAutor=rst.getInt(3);

idPrateleira=rst.getInt(4);

idEditora=rst.getInt(8);
//  String foto = conn.rs.getString(16);

rst1=conn.executaConsulta("*","tipoacervo where idtipoAcervo = "+idTipo );

while (rst1.next())

{

tipo=rst1.getString(2);

}rst1.close();
rst1=conn.executaConsulta("*","area where id = "+idArea );
  while (rst1.next())
{
 area=rst1.getString(2);
  }rst1.close();

  rst1=conn.executaConsulta("*","autor where idautor = "+idAutor );
  while (rst1.next())
{
 autor=rst1.getString(2);
  }rst1.close();

  rst1=conn.executaConsulta("*","prateleira where idprateleira = "+idPrateleira );
  while (rst1.next())
{
 prateleira=rst1.getString(2);
  }rst1.close();

  rst1=conn.executaConsulta("*","editora where ideditora = "+idEditora );
  while (rst1.next())
{
 editora=rst1.getString(2);
  }rst1.close();

//Inserindo o resultado da consulta na tabela//
modelo.addRow(new Object[]{codigo,tipo,titulo,area,autor,prateleira,editora});

}//   BtnLimpar.setEnabled(true);
conn.fecharConnecção();
}catch(SQLException eS){

eS.printStackTrace();

}

}[/size]
Soraynha

Este é meu metodo que realiza as consultas, porem essas consultas necessitam ser feitas com frequencia em um banco de dados com um numero de registros enormes, a minha classe de conexão tem um metodo chamado executaConsulta que recebe o nome dos campos e a tabela seguida da condição (where), o que eu quero na verdade é otimizar essa consulta que é o modelo padrão das demais.

wbdsjunior
acho que você pode trocar esse monte de consulta por isso:
consulta.append("select acervo.codigo");
consulta.append("     , tipoacervo.nome");
consulta.append("     , area.nome");
consulta.append("     , autor.nome");
consulta.append("     , prateleira.nome");
consulta.append("     , editora.nome");
consulta.append("  from acervo");
consulta.append("  left join tipoAcervo");
consulta.append("    on tipoacervo.id = acervo.acervoId");
consulta.append("  left join area");
consulta.append("    on area.id = acervo.areaId");
consulta.append("  left join autor");
consulta.append("    on autor.id = acervo.autorId");
consulta.append("  left join prateleira");
consulta.append("    on prateleira.id = acervo.prateleiraId");
consulta.append("  left join editora");
consulta.append("    on editora.id = acervo.editoraId");
consulta.append(" where acervo.").append(campoBuscado).append(" like '%").append(textoBuscado).append("%'");
rst1 = conn.executaConsulta(consulta.toString());
consulta.delete(0, consulta.length());

while (rst1.next()) {
    codigo=rst1.getString(1);
    tipo=rst1.getString(2);
    area=rst1.getString(3);
    autor=rst1.getString(4);
    prateleira=rst1.getString(5);
    editora=rst1.getString(6);
    modelo.addRow(new Object[]{codigo, tipo, titulo, area, autor, prateleira, editora});
}
uma única consulta que traz todos os dados.

se ficou dúvidas, pergunte.

Ironlynx

Dica de quem já fez m… no passado lidando com um bando de Strings soltas e nervosas em consultas a base:
Faz um arquivinho de propriedades(um .properties, tem artigo bacana aqui no GUJ)e seja feliz. :smiley:

Soraynha

Ola desta vez tow passando pra dar meu muito obrigada a todos que me ajudaram implementei os codigos e ta funcionando muito bem, a galera da guj é muito maneira mesmo !!![size=18] [/size][color=violet] [/color]

Criado 8 de dezembro de 2009
Ultima resposta 10 de dez. de 2009
Respostas 8
Participantes 4