osk 0 Denunciar post Postado Março 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? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Março 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 ? Compartilhar este post Link para o post Compartilhar em outros sites
osk 0 Denunciar post Postado Março 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 Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 7, 2012 Ficou faltando um igual ali: produtosFornecedores.idProduto = produtos.id Compartilhar este post Link para o post Compartilhar em outros sites
osk 0 Denunciar post Postado Março 7, 2012 Acrescentei o igual, mas a questão da lentidão continua mesmo assim. Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 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. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Março 7, 2012 Publique a descrição da tabela e seus índices. Compartilhar este post Link para o post Compartilhar em outros sites
osk 0 Denunciar post Postado Março 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 ; Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 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. Compartilhar este post Link para o post Compartilhar em outros sites
osk 0 Denunciar post Postado Março 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: Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 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. Compartilhar este post Link para o post Compartilhar em outros sites
osk 0 Denunciar post Postado Março 8, 2012 Show vou ler aqui, obrigado. Resolvido :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Março 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. Compartilhar este post Link para o post Compartilhar em outros sites
Fabiano Abreu 22 Denunciar post Postado Março 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 Compartilhar este post Link para o post Compartilhar em outros sites