Ir para conteúdo

Arquivado

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

Enizaldo

Query muito lenta

Recommended Posts

Pessoas, nada melhor que inserir abaixo a imagem da minha atual estrutura. antes vou explicar o meu problema.

 

Minhas tabelas estão carregadas de dados, quase um milhão de logradouros, 50 mil bairros, 2 milhões de empresas, onde estas empresas podem estar em vários endereços, e para cada endereço elas podem ser colocadas em categorias diferentes.

Ex:

Clínica Blá - Av. Paulista - Categorias: Podologia, Oftalmologia, Cardiologia, etc

Clínica Bla - Av. Consolação - Categorias: Neurologia, Psicologia

(Exemplo bem tosco :) )

 

A minha consulta ta demorando uns 50 segundo com a seguinte query:

Alguém consegue me dar um help?

 

 

 

 

SELECT empresas.nome_fantasia, bairros.nome_bairro
FROM (`uf`)
JOIN `cidades`
ON `cidades`.`cd_uf` = `uf`.`cd_uf`
JOIN `bairros`
ON `cidades`.`cd_cidade` = `bairros`.`CD_CIDADE`
JOIN `logradouros`
ON `bairros`.`cd_bairro` = `logradouros`.`CD_BAIRRO`
JOIN `logradouro_has_empresa`
ON `logradouros`.`CD_LOGRADOURO` = `logradouro_has_empresa`.`logradouro_cd_logradouro`
JOIN `empresas`
ON `empresas`.`idempresa` = `logradouro_has_empresa`.`empresa_idempresa`
JOIN `categoria_n3_x_logradouro_has_empresa`
ON `categoria_n3_x_logradouro_has_empresa`.`logradouro_has_empresa_idlogradouro_has_empresa` = `logradouro_has_empresa`.`idlogradouro_has_empresa`
JOIN `categoria_n3`
ON `categoria_n3_x_logradouro_has_empresa`.`categoria_idcategoria_n3` = `categoria_n3`.`idcategoria_n3`

WHERE `bairros`.`bairro_slug` = 'interlagos-sao-paulo'
AND `cidades`.`slug_cidade` = 'sao-paulo'
AND `uf`.`ds_uf_sigla` = 'sp'
AND `categoria_n3`.`slug_categoria_n3` = 'padarias-e-confeitarias'

 

 

DB_imagem.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

As tabelas tem índices ?

As estatisticas estao atualizadas ?

Lembre que MySql tem mecanismos de busca de "full text" pensou em usa-los ?

Todos os joins das tabelas foram usados ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, obrigado a resposta.

 

As tabelas estão bem indexadas, as buscas que faço são em campos varchar contendo slugs apenas. Coloquei um índice comum, não o fulltext. Na verdade tentei pela interface do phpMyAdmin mas fica desabilitada a opção de adicionar indice fulltext.

Todos os joins serão utilizados, pois preciso apresentar os dados completos.

 

Valeu pela dica, se puder continuar tentando desvendar isso...

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

por

 

Todos os joins das tabelas foram usados ?

 

entenda :

 

... todos os campos que fazem os joins entre as tabelas forma passado ? Iisto pode gerar um produto cartesiano indevido e maior demora

 

---------------------

o Plano de Execução da query não ajuda em nada ?

 

----------------------

 

 

... mas fica desabilitada a opção de adicionar indice fulltext....

 

Seria bom saber o motivo, não trabalho com Mysql mas sei que isto envolve versão e outros fatores.

O full text é a ferramenta para este tipo de busca (web)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma pesquisa e entendi a questão do índice fulltext.

Estou usando uma versão do MySQL onde o fulltext só é compatível utilizando o tipo MyISAM, no meu casso uso InnoDB.

Acha interessante alterar para MyISAM ?

 

Em relação aos Joins estou pegando exatamente a chave das ligações em cada tabela., tanto que rodei o EXPLAIN e me retornou todos os indices sem apresentar problemas.

 

Uma pergunta: É possível ficar lento mesmo por conta da quantidade de dados?



Detalhe, a consulta que mencionei acima, me retorna apenas duas linhas!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acha interessante alterar para MyISAM ?

 

Só você pode dizer isto.Faça um teste.

 

Uma pergunta: É possível ficar lento mesmo por conta da quantidade de dados?

 

Algumas consultas são mesmos lentas, por isto índices e outros artifícios são usados para reduzir o tempo.

 

Detalhe, a consulta que mencionei acima, me retorna apenas duas linhas!

 

Pode até retornar zero e demorar ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prog, obrigado pela resposta. Vc tem alguma sugestão de acordo com minha necessidade?

A idéia é cada empresa poder ter vários endereços, e cada endereço estar ligado a uma ou várias categorias.

 

[]s



Motta, vlw pela resposta.

Vou tentar alrar para MyISAM e retorno a vocês.

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma saída é a busca por códigos , no fornt-end se exibe checkboxs com os nomes da cidade , bairro etc mas na marcação se busca pelo código algo assim

 

 

Cidade Rio de Janeiro (x)
       Niterói ( )

 

Bairros : Centro ( )
          Flamengo (x)
          Botafogo (x)
          Copacabana ( )

No sql fica algo como

 

 

select *
from ....
where cidade in (123) /* rio */
and (bairro = 38 /*flamengo*/ or bairro = 56 /*botafogo*/)
...

 

O sql é montado de forma dinamíca (cuidado com injetion ...)

 

A vantagem é a busca pelo código e não por string ...

 

A desvantagem é que "encaixota" a busca ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meus amigos, me surpreendi, realmente MyISAM deu um banho no innoDB.

Retirei todas as ligações que podem ver na imagem acima, transformei as tabelas "empresas" e "logradouro_has_empresa" em MyISAM e as buscas que demoravam 40 e 50 segundos são retornadas em 0.01 s.

 

Valeu a dica de vocês, obrigado.

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.