osk 0 Report post Posted March 7, 2012 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
Motta 645 Report post Posted March 7, 2012 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
osk 0 Report post Posted March 7, 2012 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
Prog 183 Report post Posted March 7, 2012 Ficou faltando um igual ali: produtosFornecedores.idProduto = produtos.id Share this post Link to post Share on other sites
osk 0 Report post Posted March 7, 2012 Acrescentei o igual, mas a questão da lentidão continua mesmo assim. Share this post Link to post Share on other sites
Prog 183 Report post Posted March 7, 2012 Í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
Motta 645 Report post Posted March 7, 2012 Publique a descrição da tabela e seus índices. Share this post Link to post Share on other sites
osk 0 Report post Posted March 8, 2012 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
Prog 183 Report post Posted March 8, 2012 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
osk 0 Report post Posted March 8, 2012 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
Prog 183 Report post Posted March 8, 2012 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
osk 0 Report post Posted March 8, 2012 Show vou ler aqui, obrigado. Resolvido :thumbsup: Share this post Link to post Share on other sites
Motta 645 Report post Posted March 8, 2012 Í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
Fabiano Abreu 22 Report post Posted March 9, 2012 Vendendo meu peixe :thumbsup: http://paposql.blogspot.com/2011/10/o-que-e-um-indice.html Abraços. _ _ Fabiano Abreu Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL Share this post Link to post Share on other sites