[RESOLVIDO] Aumentar a velocidade das consultas no MySQL

6 respostas
R

Bom dia galera,

Eu tenho probleminha…

Estou fazendo uma aplicação que tem uma consulta das salas que estão agendadas… Só que esta consulta está demorando muito… Alguém sabe melhorar ? Já criei algumas INDEX para melhorar a consulta, segue abaixo o meu código.

Esse código abaixo é minha JSP, existem mais de 10 desses ai na minha JSP… ai demora pra carregar(normal, pois são inumeras consultas…) !!

<tr height="30">

		<%
			if (s.getSituacao() == 1
						&& sd.findByReserva(s.getCodigo(), data, "09:00:00") == 0) {
		%>
		
			<%
				if(ad.agendarHorario(data + " 09:00:00", ad.dataAtual()) == 1){
			%>
			
		<td align="center"  style="background-color:#EAEAEA;">
		<input type="radio" name="idsala" value="<%=s.getCodigo() %> 0900 ${data} 09:00:00" title="09:00"/>
		</td>

			<%
					}else {
			%>
					<td align="center" style="background-color:#EAEAEA;"><img src="images/icon/apagar.png" alt="Horário Restrito" border="0" title="Horário Restrito" width="16" height="16"/></td>
		<%
					}
		
			} else {
		%>

		<td align="center" style="background-color:#EAEAEA"><a href="#"
			onmouseover="Tip('Horário:<%=ad.findByDados(
									sd.findByReserva(s.getCodigo(), data,
											"09:00:00")).getDataHoraInicial()%> as <br/> Solicitante:<%=fd.findByMat(
									ad.findByDados(
											sd.findByReserva(s.getCodigo(),
													data, "09:00:00"))
											.getAgendadoPor()).getNome()%> <br/> Agendado Por:<%=fd.findByMat(
									ad.findByDados(
											sd.findByReserva(s.getCodigo(),
													data, "09:00:00"))
											.getAgendadoPor()).getNome()%> ')"
			onmouseout="UnTip()"><img src="images/icon/reserved.png" alt="Reservado" border="0" width="16" height="16"/></a></td>



		<%
			}

Minhas Index Criadas:

CREATE INDEX index_findallandar2 on sala(andar);

CREATE INDEX index_agendamento on agendamento(codSala,dataHoraInicial);

CREATE INDEX index_findbyreserva on agendamento(Codigo,codSala, dataHoraInicial);

CREATE INDEX index_findbydados on agendamento(Codigo);
CREATE INDEX index_findbymat on funcionario(matricula);

Aqui é o a Classe que gerencia as consultas…

Um dos findby… aí:

public List<Sala> findByAllAndar2(String andar, String dataHora)
			throws Exception {

		open();
		List<Sala> listasala = new ArrayList<Sala>();
		stmt = con
				.prepareStatement("select * from sala s USE INDEX(index_findallandar2) where andar = ?");
		stmt.setString(1, andar);
		rs = stmt.executeQuery();

		while (rs.next()) {

			Sala s = new Sala(rs.getInt("s.Codigo"), rs.getString("s.Nome"),
					rs.getInt("s.MaxPessoas"), rs.getString("s.Andar"),
					rs.getInt("s.Situacao"), new ArrayList<Agendamento>());

			listasala.add(s);

		}

		rs.close();

		for (Sala s : listasala) {

			stmt = con
					.prepareStatement("select * from agendamento USE INDEX (index_agendamento) where CodSala = ? and DataHoraInicial BETWEEN ? '09:00:00' and ? '18:00:00'");
			stmt.setInt(1, s.getCodigo());
			stmt.setString(2, dataHora);
			stmt.setString(3, dataHora);
			rs = stmt.executeQuery();

			while (rs.next()) {

				Agendamento a = new Agendamento(rs.getInt("Codigo"),
						rs.getString("DataHoraInicial"),
						rs.getString("DataAgendamento"), rs.getInt("Situacao"),
						rs.getString("dataDesmarcacao"), rs.getString("Tema"));

				s.getListaagendamento().add(a);

			}

		}

		close();
		return listasala;
	}

Agradeço DESDE JÁ !!!
:smiley:

6 Respostas

D

Uma dica que eu é que vc sempre deve especificar os campos que vc quer no select, não faz sentido vc mandar trazer todos os campos se vc só vai usar 3.

Ao inves de fazer isso

Select * from tabela

Faça

Select campo1, campo2, campo3 from tabela

Isso já vai ajudar no desempenho da sua consulta.

R

Dibilou:
Uma dica que eu é que vc sempre deve especificar os campos que vc quer no select, não faz sentido vc mandar trazer todos os campos se vc só vai usar 3.

Ao inves de fazer isso

Select * from tabela

Faça

Select campo1, campo2, campo3 from tabela

Isso já vai ajudar no desempenho da sua consulta.

É verdade amigo, não tinha pensado nisso… OBRIGADOO Dibilou !!

Muito obrigado, irei fazer agora.

=]

Se alguém tiver outras dicas, como uma busca em Jquery… não sei… só quero melhorar a velocidade.

Muito obrigado.

FacaNaCaveira

Fala ai rsmoraes

Uma outra sugestão para agilizar as suas consultas, é criar Stored Procedures para efetuar as consultas de maior volume de dados. O grande lance da SP, é que o MySql cria um plano de execuçao para ela na primeira vez que é executada e depois na outras vezes como esse plano ja esta criado ela so executa. Criei alguns sites com stored procedures e no meu caso agilizou bastante.

Outra sugestão é na criação de consultas onde vc irá utilizar mais de uma tabela, utilizar a forma com INNER JOIN ao inves da forma ANTIGA (tabela1 t1, tabela 2 t2, …).

Na Clausula WHERE sempre colocar primeiro os itens que são parametros pra consulta e no final os relacionamentos com as tabelas
Exemplo:

SELECT campo1, campo2, campo3 FROM Tabela1 T1, Tabela T2
WHERE T1.conta =333656 AND
T2.poupanca = 54546 AND
[color=red]T1.ID = T2.ID[/color]

Fazendo isso, voce elimina uma quantidade de dados muito maior do que colocando o item em vermelho como primeiro da clausula WHERE.

Abração

R

FacaNaCaveira:
Fala ai rsmoraes

Uma outra sugestão para agilizar as suas consultas, é criar Stored Procedures para efetuar as consultas de maior volume de dados. O grande lance da SP, é que o MySql cria um plano de execuçao para ela na primeira vez que é executada e depois na outras vezes como esse plano ja esta criado ela so executa. Criei alguns sites com stored procedures e no meu caso agilizou bastante.

Outra sugestão é na criação de consultas onde vc irá utilizar mais de uma tabela, utilizar a forma com INNER JOIN ao inves da forma ANTIGA (tabela1 t1, tabela 2 t2, …).

Na Clausula WHERE sempre colocar primeiro os itens que são parametros pra consulta e no final os relacionamentos com as tabelas
Exemplo:

SELECT campo1, campo2, campo3 FROM Tabela1 T1, Tabela T2
WHERE T1.conta =333656 AND
T2.poupanca = 54546 AND
[color=red]T1.ID = T2.ID[/color]

Fazendo isso, voce elimina uma quantidade de dados muito maior do que colocando o item em vermelho como primeiro da clausula WHERE.

Abração

Eu não uso a forma antiga, só usei pois eu estava usando o USE INDEX(nome_index) e não sei pq estava dando erro, ai eu usei a forma antiga e funcionou…
Todo o meu projeto está com inner ou left join…
Obrigado pelas dicas… Vou dar uma estudada em Stored Procedure para aumentar a velocidade destas consultas… :smiley:

Muito obrigadoooooooooooooooooo !!!

PS: Sua foto é maneira kkkk, um dia tirarei esta onda.

pmlm

Hoje em dia isso já não é verdade, uma vez que as próprias BDs são inteligentes o suficiente para fazer essa optimização, independentemente da ordem das clausulas

R

Resolvido !!!

Bom, eu criei um método passando alguns parâmetros que eu precisava e minimizei a quantidade das consultas, fazendo com que a resposta fosse mais rápida.

Eu tinha praticamente umas 4 consultas na mesma linha e várias condições… EU eliminei alguns detalhes das consultas…

Era Assim:

agendamentoDao agendamento = new AgendamentoDao();

agendamento.findNome(“sala”);

agendamento.findTelefone(“sala”);

agendamento.findEndereco(“sala”);

agendamento.findAAgenda(“sala”);

ai eu fiz mais ou menos assim:

agendamento.findGeral(nome, telefone, endereco, agenda);

FOI MAIS OU MENOS ISSO !!!

Muito obrigado pela ajuda galera.

Qualquer coisa estamos aew.

Criado 10 de fevereiro de 2012
Ultima resposta 10 de fev. de 2012
Respostas 6
Participantes 4