Ir para conteúdo

Arquivado

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

osk

not exists

Recommended Posts

Olá, estou com alguns problemas para usar o NOT EXISTS:

 

Tenho dois db "produtos" e "produtosFornecedores" que contém as seguintes tabelas:

 

"produtos"

id (INT)

produto (VARCHAR)

 

"produtosFornecedores"

id (INT)

idProduto (INT)

idFornecedor (INT)

data (date)

 

Eu preciso relacionar produtos a um fornecedor, mas queria eliminar os produtos que já estão relacionados então tentei:

 

SELECT id,UPPER(produto) as produtoU FROM produtos WHERE NOT EXISTS (SELECT * FROM produtosFornecedores WHERE produtos.id = idProduto AND produtosFornecedores.idFornecedor = '$idFornecedor')

 

 

Que em meus teste funciona só que a consulta está muita lenta demorando quase 1 minuto para mostra os que não estão relacionados.

 

Será que está correto, ou existe outra forma?

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT id,UPPER(produto) as produtoU FROM produtos 
WHERE NOT EXISTS (SELECT null 
                 FROM produtosFornecedores 
                 WHERE produtosFornecedores.idProduto produtos.id  
                 AND produtosFornecedores.idFornecedor = '$idFornecedor')

 

produtosFornecedores tem índice por idProduto ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta me desculpe mas não sei o que quer dizer índice :blush:

 

Com esta modificação apareceu o seguinte erro:

 

 

Ocorreu um erro ao executar a Query SQL abaixo:
SELECT id,UPPER(produto) as produtoU FROM produtos WHERE NOT EXISTS (SELECT null FROM produtosFornecedores WHERE produtosFornecedores.idProduto produtos.id AND produtosFornecedores.idFornecedor = '1')<

MySQL Retornou: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'produtos.id AND produtosFornecedores.idFornecedor = '1')' at line 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acrescentei o igual, mas a questão da lentidão continua mesmo assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Índices, em banco de dados, funcionam como atalhos, quando você faz uma junção, ordenação ou filtro, o sistema de banco de dados pode fazer uso de um índice para agilizar a consulta. Se um determinado campos chave ou que faz parte de uma junção não tiver índice a velocidade da consulta pode ser bastante prejudicada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Publique a descrição da tabela e seus índices.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho isso:

 

CREATE TABLE IF NOT EXISTS `produtos` (
 `id` int(11) NOT NULL auto_increment,
 `produto` varchar(400) NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=653 ;

 

 

CREATE TABLE IF NOT EXISTS `produtosFornecedores` (
 `id` int(11) NOT NULL auto_increment,
 `idProduto` int(11) NOT NULL,
 `idFornecedor` int(11) NOT NULL,
 `data` date NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=44937 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... o que você pode fazer é:

 

CREATE INDEX idx_produtosFornecedores_idProduto ON produtosFornecedores (idProduto)

 

Em seguida execute o SELECT e veja se houve algum ganho no tempo da execução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nosssaaaaa Prog agora abre em segundos, ainda não entendi o pq resolveu, mas vou procurar sobre create index.

 

Muito obrigado a você é ao Motta.

 

 

:clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui tem uma boa explicação, embora seja para uma versão antiga do MySQL.

http://dev.mysql.com/doc/refman/4.1/pt/mysql-indexes.html

 

A teoria vale para todos os sistemas de banco de dados relacionais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Índice é como uma lista telefônica, imagine uma lista imprensa (das antigas) de São Paulo, fora de qualquer ordem e você tem de achar o telefone de alguém pelo nome, levaria dias, com um índice o faz em segundos.

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.