Ir para conteúdo

POWERED BY:

Arquivado

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

Eds (master)

Melhor forma de fazer o select

Recommended Posts

Olá a todos! De inicio já agradeço a quem puder ajudar a tirar minha duvida! Bem no meu site tem um sistema de multimídia (adiciona episódios que é da categoria x e subcategoria y), tenho duvida em relação ao select que exiba os dados de multimídia, no meu ponto de vista eu acho que ficaria melhor tentar pegar todas as informações necessárias em um unico select pra poder jogar depois do while... mas já em alguns posts vi que query com varios joins as vezes em vem de deixar mais rápido fica mais lento. Ai que fico em duvida e gostaria de saber como "otimizar" o select de modo correto. Melhor otimização seria separar o select e colocar uma parte dentro do proprio while? usar views? Bem segue o select:

 

SELECT t1.multimidia_id, t1.nome, t1.numero, t1.fansub, t1.idioma, t1.tamanho, t1.codec, t1.time, t1.descricao, t1.mirror1_tipo, t1.mirror1_url, t1.mirror2_tipo, t1.mirror2_url, t1.usuario_id, t1.downloads, t1.tutorial_id, t1.num_votos, t1.votos, t2.usuario, t3.nome AS tutorialnome, t4.color FROM global_multimidia AS t1 LEFT JOIN comunidade AS t2 ON (t1.usuario_id=t2.usuario_id) LEFT JOIN home_tutoriais AS t3 ON (t1.tutorial_id=t3.tutorial_id) LEFT JOIN comunidade_perfil AS t4 ON (t2.usuario_id=t4.usuario_id) WHERE (categoria_id='$categoria_id' AND subcategoria_id='$subcategoria_id' AND canal_id='$myCanalid') ORDER BY numero ASC LIMIT $inicial,$mostrar

A var $categoria_id e $subcategoria_id vem via get, a $myCanalid vem do script é um inteiro, $inicial vem da função de paginação e $mostrar é sempre 10.

 

Obrigado a todos ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenha certeza que os campos usuario_id, tutorial_id, categoria_id e subcategoria_id sejam indices da tabela.

tem queries com vários LEFT JOIN que executam em 50~100ms, não é uma questão de SER o join que vai influenciar na velocidade, mas COMO ele é feito, e no seu caso, é simplesmente uma relação entre tabelas, sem subqueries de select ou condicionais.

Fazer a "disjunção" dos dados dentro do while, no código PHP, seria muito melhor do que fazê-lo diretamente no query do MYSQL, na MAIORIA das vezes é melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da um explain nisso ai e cola aqui

 

explain SELECT t1.multimidia_id, t1.nome, t1.numero, t1.fansub, t1.idioma, t1.tamanho, t1.codec, t1.time, t1.descricao, t1.mirror1_tipo, t1.mirror1_url, t1.mirror2_tipo, t1.mirror2_url, t1.usuario_id, t1.downloads, t1.tutorial_id, t1.num_votos, t1.votos, t2.usuario, t3.nome AS tutorialnome, t4.color FROM global_multimidia AS t1 LEFT JOIN comunidade AS t2 ON (t1.usuario_id=t2.usuario_id) LEFT JOIN home_tutoriais AS t3 ON (t1.tutorial_id=t3.tutorial_id) LEFT JOIN comunidade_perfil AS t4 ON (t2.usuario_id=t4.usuario_id) WHERE (categoria_id='$categoria_id' AND subcategoria_id='$subcategoria_id' AND canal_id='$myCanalid') ORDER BY numero ASC LIMIT $inicial,$mostrar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que da para entender ^^

 

select_type => SIMPLE, table => t1, type => ref, possible_keys => categoria_id,subcategoria_id, key => subcategoria_id, key_len => 4, ref => const, rows => 24, extra => Using where; Using filesort

select_type => SIMPLE, table => t2, type => eq_ref, possible_keys => PRIMARY, key => PRIMARY, key_len => 4, ref => t1.usuario_id, rows => 1, extra => empty

select_type => SIMPLE, table => t3, type => eq_ref, possible_keys => PRIMARY, key => PRIMARY, key_len => 4, ref => t1.tutorial_id, rows => 1, extra => empty

select_type => SIMPLE, table => t4, type => eq_ref, possible_keys => PRIMARY,usuario_id, key => PRIMARY, key_len => 4, ref => t1.usuario_id, rows => 1, extra => empty

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.