Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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
Ficou faltando um igual ali:
produtosFornecedores.idProduto = produtos.id
Acrescentei o igual, mas a questão da lentidão continua mesmo assim.
Í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.
Publique a descrição da tabela e seus índices.
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 ;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.
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:
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.
Show vou ler aqui, obrigado. Resolvido :thumbsup:
Í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.
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
produtosFornecedores tem índice por idProduto ?