Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leandro Volanick

Select em banco de dados muito grande

Recommended Posts

Ola.

Tenho um banco de dados com 7 tabelas.

Elas juntas contem mais de 50 milhões de registros.

quero buscar registros dentro delas, mas minha consulta está demorando mais de 1,5 minutos.

 

Como poderia agilizar ela?

 

Segue o que estou usando:

 

 


 <?php

$a = $_GET['a'];

if ($a == "buscar") {
 

	$palavra = trim($_POST['palavra']);
	$estado = trim($_POST['estado']);
	$cidade = trim($_POST['cidade']);
 

	
	$sql = mysql_query("
	
	
	
	SELECT  NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM FIS2
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL 
	
	SELECT  NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM FIS3
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM FIS4
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM FIS5
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'		
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM FIS6
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM FIS7
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM JUR1
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM JUR2
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM JUR3
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM JUR4
	WHERE NOME LIKE '".$palavra."%' AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM  JUR5 
	WHERE NOME LIKE '".$palavra."%' AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM JUR6
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	UNION ALL
	
	SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM JUR7
	WHERE NOME LIKE '".$palavra."%'  AND CIDADE LIKE '".$cidade."%'
	
	
	

	
	 ") ;
 
	
	$numRegistros = mysql_num_rows($sql);
 
	
	if ($numRegistros != 0) {
		// Exibe os produtos e seus respectivos preços
		while ($produto = mysql_fetch_object($sql)) {
			echo "<div class=\"wrong\">

			$produto->NOME <br />";
			echo "<font COLOR=#000000 font-weight: bold; font-size:1;>($produto->DDD)$produto->TELEFONE</font></a><br />";
			echo "<font COLOR=#000000 font-weight: bold; font-size:1;>$produto->TIPO $produto->ENDERECO, $produto->NUMERO - $produto->BAIRRO</font></a><br />";
			echo "<font COLOR=#000000 font-weight: bold; font-size:1;>$produto->CIDADE, $produto->UF | CEP: $produto->CEP</font></a><br />";
			
			echo '<img src="" border=0 height="1" width="200">';echo "<font COLOR=#000000 font-weight: bold; size=+1></font> <br />";
			"</div>";
		}
	// Se não houver registros
	} else {
		echo "Nenhum produto foi encontrado com a palavra ".$palavra."";
	}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Leandro.

existem algumas formas de fazer com que essa query seja minimizada.

Criar indices para os campos e ter relação entre as tabelas. isso já iria te ajudar no processamento das querys.

Do jeito que você está tentando fazer seria mais recomendavél usar o mongoDB.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Criar um indide para as colunas

Note que mesmo com um índice comum para uma coluna (não FULL TEXT) a busca com LIKE tem comportamento diferente

 

CIDADE LIKE '%RIO%' -- não usa o index

 

CIDADE LIKE 'RIO%' -- pode usr o index (depende de fatores coo estatiscas atualizadas, tamanho tabela etc)

=====================================================================

2) Poderia ser estudado a criação de um índice do tipo FULL TEXT, dê uma busca por <index full text sql server> no Google por exemplo.

 

Mas deve-se pesar o ganho na busca contra a perde na manutenção (insert/delete/update) nas tabelas.

==================================================================

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

criei um index para o campo nome.

 

 

SELECT NOME, TIPO, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, DDD, CEP, TELEFONE FROM FIS2 WITH(INDEX = nome )
WHERE NOME LIKE '".$palavra."%' AND CIDADE LIKE '".$cidade."%'
MAS ELE NAO ENCONTRA NADA DAI.
SE EU UTILIZO LIKE '%".$palavra."%' ELE DEMORA MAIS AINDA PARA ENCONTRAR.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O LIke com o "coringa" no começo tira a possibilidade do uso do index.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) São várias tabelas, todas (ou ao menos as de mais registros) devem ter índices para agilizar.

==========

2) Pela sua query

 

WHERE NOME LIKE '".$palavra."%' AND CIDADE LIKE '".$cidade."%'

não tem coringa no inicio da busca.

=====

3) Sabe fazer o Plano de Execução da query ?

 

Verifique se o índice está sendo utilizado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu deixasse todos os dados em uma unica tabela, melhoraria o desempenho?

 

Depende pois esta tabela seria provavelmente muito maior o que pesa no fator de busca.Pesa também por que as tabelas são separadas.

 

A busca deveria ser sempre em todas as tabelas ou haveria como direcionar em quais tabelas buscar ?

======================

Já vi um poblema parecido a solução foi :

 

Fazer sempre a pesquisa sem o 1º % , a coluna tinha um índice pelo campo, um "checkbox" na pesquisa informava algo como

 

< > busca em qualquer parte do nome

com o check a query era montada com o 1º % ou não.

 

Isto meio que acostumava o usuário a refinar a busca e saber que a busca por parte demorava um pouco mais.

 

A marcação "default" no check era pela busca sem o 1º %.

=============

Mas toda solução dos detalhes do Sistema, sem saber o que difere JUR2 de JUR3 fica difiícil opinar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo, difere apenas os dados. sao nomes de empresas, com endereço. eu tinha em um arquivo mdb aqui e converti pra sql.

eram 7 arquivos, JUR1...JUR2... etc. o campo busca meu procura apenas na coluna nome.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Unifica as tabelas

Cria indices das colunas alvo de pesquisa

Faz a busca inicialmente sem o 1% e se o usuários quiser com o 1%.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas se o usuário optar por busca total

'%".$palavra."%'

 

creio ser isto , não conheço a linguagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende de como foi implementado.

 

Esta query roda via o que ? Um programa ? Um form de web ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.