Ir para conteúdo

POWERED BY:

Arquivado

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

William Bruno

[Resolvido] Perdendo desempenho na APP por causa de uma query

Recommended Posts

Me vi obrigado a fazer essa query abaixo:

SELECT news_id, news_titulo, cat_nome
			FROM `news`
			INNER JOIN news_categoria ON news_categoria.cat_id = news.news_categoria
			WHERE news_id
			IN (
				SELECT MAX( news_id )
				FROM news
				WHERE news_tipo
				IN ( 2, 4, 5, 6 )
				GROUP BY news_tipo
			)
resultado:

Mostrando registros 0 - 3 (4 total, Consulta levou 8.2740 segundos)

tá lenta.. nessa base que rodei, tenho apenas 4 mil registros, em produção, já estou com 4~5 vezes essa quantidade.

 

O sistema está pronto. Apenas vou refazê-lo, e como deve continuar funcionando para as antigas, não posso remodelar muito a base.

 

Tudo isso, porque, pela modelagem e lógica do programador do sistema antigo, isso aqui:

SELECT *
FROM `news`
WHERE `news_tipo` =2
pode retornar várias linhas.. e só a linha com MAIOR ID me interessa.

E preciso dos news_tipo IN (2,4,5,6) - pois estes são os tipos das 'manchetes', para que eu monte na home do site.

 

Alguém tem alguma sugestão ? a query que fiz funciona, mas me parece lenta.. tem 2 IN

 

Titulo edit: perca de http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Perdendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que eu entendi certo? Seria algo assim?

 

SELECT news_id, news_titulo, cat_nome
FROM `news`
INNER JOIN news_categoria ON news_categoria.cat_id = news.news_categoria
WHERE news_tipo IN ( 2, 4, 5, 6 )
GROUP BY news_tipo 
ORDER BY news_tipo DESC

 

Não testei, mas veja se funciona.

 

Carlos Eduardo

 

PS: O título é assim?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente funciona Matias ! vlw.. um poco depois de postar, resolvi separar as consultas:

$sql = "SELECT MAX( news_id ) AS news_id 
			FROM news
			WHERE news_tipo
			IN ( 2, 4, 5, 6 )
			GROUP BY news_tipo";
		$query = self::$db->query( $sql );

		while( $dados = $query->fetch_object() )
			$arr[] = $dados->news_id;
			
		
		$sql = "SELECT news_id, news_titulo, cat_nome   
			FROM `news` 
			INNER JOIN `news_categoria` 
			ON `news_categoria`.`cat_id` = `news`.`news_categoria` 
			WHERE news_id
			IN (".implode(',', $arr).")
			ORDER BY news_tipo ";
			
		$query = self::$db->query( $sql );
fez em 0,0026 a primeira, e 0,0004 a segunda.

A que você me mandou, fez em 0.0035 segundos

 

Muito melhor que os meu 8segundos iniciais.. mas agora tô em dúvida, com qual forma fico.. as 2 que 'parecem' mais rápida, apesar de eu precisar de usar php para fazer um loop e um implode, ou se fico com a que você me mandou.

 

Repensando, algo como: 'Perca de desempenho por causa de subquery', ficaria mais condizente.. sei lá.. ^_^ desacostumei, em postar 'dúvidas'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu utilizaria uma consulta só, porque um número grande (ou pequeno) de usuários acessando o sistema ao mesmo tempo, uma consulta a mais para cada usuário pode fazer a diferença.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhor mesmo ^_^

 

Vlw Matias. [Resolvido]

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.