Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

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?

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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 ;

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.