Ir para conteúdo

POWERED BY:

Arquivado

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

Paulo Caesar

Busca + Tabelas de Relacionamento

Recommended Posts

SELECT `transportes`.`id`
FROM `transportes` 
#BAIRROS JOIN
LEFT JOIN `xbairros` ON `xbairros`.`transporte_id` = `transportes`.`id` AND `xbairros`.`bairro_id` IN (SELECT `id` FROM `bairros` WHERE `nome` LIKE '%minas%')
#CARACTERISTICAS JOIN
LEFT JOIN `xcaracteristicas` ON `xcaracteristicas`.`transporte_id` = `transportes`.`id` AND `xcaracteristicas`.`caracteristica_id` IN (SELECT `id` FROM `caracteristicas` WHERE `nome` LIKE '%minas%')
#CIDADES JOIN
LEFT JOIN `xcidades_estados` ON `xcidades_estados`.`transporte_id` = `transportes`.`id` AND (`xcidades_estados`.`cidade_id` IN (SELECT `id` FROM `cidades` WHERE `cidade` LIKE '%minas%') OR `xcidades_estados`.`estado_id` IN (SELECT `id` FROM `estados` WHERE `estado` LIKE '%minas%'))
#TURNOS JOIN
LEFT JOIN `xturnos` ON `xturnos`.`transporte_id` = `transportes`.`id` AND `xturnos`.`turno_id` IN (SELECT `id` FROM `turnos` WHERE `nome` LIKE '%minas%')
#SELECT RESULT 
WHERE `xturnos`.`transporte_id` = `transportes`.`id` OR `xcaracteristicas`.`transporte_id` = `transportes`.`id` OR `xbairros`.`transporte_id` = `transportes`.`id` OR `transportes`.`id` = `xcidades_estados`.`transporte_id`

Atualmente é este o código que eu tenho, um "EXPLAIN" tá mostrando bons resultados:

id	  select_type table type possible_keys key key_len ref rows extra
1	PRIMARY	transportes	index	PRIMARY	PRIMARY	4	NULL	5	Using index
1	PRIMARY	xbairros	ref	PRIMARY	PRIMARY	4	mfcs0043_database.transportes.id	1	Using index
1	PRIMARY	xcaracteristicas	ref	PRIMARY	PRIMARY	4	mfcs0043_database.transportes.id	1	Using index
1	PRIMARY	xcidades_estados	ref	PRIMARY	PRIMARY	4	mfcs0043_database.transportes.id	1	Using index
1	PRIMARY	xturnos	ref	PRIMARY	PRIMARY	4	mfcs0043_database.transportes.id	1	Using where; Using index
6	DEPENDENT SUBQUERY	turnos	unique_subquery	PRIMARY	PRIMARY	1	func	1	Using where
5	DEPENDENT SUBQUERY	estados	unique_subquery	PRIMARY	PRIMARY	1	func	1	Using where
4	DEPENDENT SUBQUERY	cidades	unique_subquery	PRIMARY	PRIMARY	4	func	1	Using where
3	DEPENDENT SUBQUERY	caracteristicas	unique_subquery	PRIMARY	PRIMARY	1	func	1	Using where
2	DEPENDENT SUBQUERY	bairros	unique_subquery	PRIMARY	PRIMARY	4	func	1	Using where

Percebi que seria impossível terminar o meu sistema de busca se não utilizasse um relacionamento de tabelas 'muitos-para-muitos'. Como posso fazer pra testar uma situação no mundo real? Minha tabela de desenvolvimento possui 5 rows (na tabela transportes), 5000+ na tabela cidades, 27 na tabela estados, assim por diante. Agora, vocês acham que, com essa bagunça toda, pode dar algum problema? Porque não tem como eu fazer a busca nas tabelas de relacionamento, se eu não fizer um subquery da forma que eu estou fazendo ali (usando o IN). Ou tem outra forma mais adequada pra fazer isso? Eu estava usando uma forma não normalizada antes de mudar, tava uma bagunça, todas as informações juntas, numa tabela só. Agora tá desse jeito aí. Se precisar colocar o "CREATE TABLE" das tabelas, só me avisarem!

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um select grande nao eh necessariamente ruim, tampouco um pequeno eh bom....

 

O ideal eh que você deixe o sistema rodar , e ver se o tempo de resposta esta aceitavel ou nao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um select grande nao eh necessariamente ruim, tampouco um pequeno eh bom....

 

O ideal eh que você deixe o sistema rodar , e ver se o tempo de resposta esta aceitavel ou nao

Atualmente, fica em 16ms, porque adicionei um "COUNT(*)" ali pra tentar fazer um ranking artificial com resultados mais relevantes. Se eu tirar o count, fica em 0ms mesmo, o que eu acho suspeito. O que me preocupa são a quantidade de subqueries. E ainda, se a pessoa fizer uma busca pelo texto "pelo amor de deus acha meu carro" por exemplo, o script PHP trabalharia pra transformar cada palavra num novo LIKE... daí, nesse caso específico, seriam 7 LIKEs para cada subquery de SELECT que tenho ali no LEFT JOIN.

Outra pergunta, o "IN" é rápido? A junção de IN + LIKE teria algum impacto real na query?

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.