Fabiano R Postado Agosto 28, 2007 Denunciar Share Postado Agosto 28, 2007 Bom tarde galera...Bom minha duvida é a seguintetenho duas tabelascompara_email_geralcompara_email_novoscom a estrutura ID emailaonde na tabela compara_email_geral tem cerca de 30 mil emailse na compara_email_novos cerca de 2 mil.O que eu quero fazer é comparar os emails das duas tabelas e retornar os email que não existe na tabela compara_email_geralfiz o teste com a seguinte querySELECT compara_email_novos.emailFROM compara_email_novos LEFT JOIN compara_email_geral USING(email)WHERE compara_email_geral.email IS NULL;deu certo com poucos e-mails mas mas com essa lista.. o servidor trava.Queria saber se o mysql não tem capacidade pra fazer essa comparação com esse número de dados.alguém tem uma idéia de como posso fazer isso? algum programa desktop. alguma query?valeu. Link para o comentário Compartilhar em outros sites More sharing options...
0 paulobergo Postado Agosto 28, 2007 Denunciar Share Postado Agosto 28, 2007 Olá.Pode ser um problema na sua query...Como não tenho uma tabela assim, peguei uma de clientes (120mil registros) e dupliquei em outro catálogo; depois, nesta tabela duplicada, incluí oito registros novos.Então:select sum(1) quantosfrom `acme`.`clientes` aleft outer join `warnerbros`.`clientes` b on (a.codigo=b.codigo)where b.codigo is nullgerouquantos8em 2seg, tanto em um Pentium 1.6 512k como num Duron 1.8 392k, ambos com MySQL 5.027...E...select a.nome, a.codigofrom `acme`.`clientes` aleft outer join `warnerbros`.`clientes` b on (a.codigo=b.codigo)where b.codigo is nullmostrou os nomes e codigos novos...sendo a = tabela nova com 122356 e b = tabela original com 122348 registros.Ok? espero ter ajudado! Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabiano R Postado Agosto 28, 2007 Autor Denunciar Share Postado Agosto 28, 2007 Obrigado pela resposta Paulo.a sua comparação pelo que eu intendi é entre códigos, que provavelmente deve ser INTserá q o problema seria porque ele compara diretamente as strings de email? Link para o comentário Compartilhar em outros sites More sharing options...
0 paulobergo Postado Agosto 28, 2007 Denunciar Share Postado Agosto 28, 2007 O código no caso é varchar(5)... Aí, uma coisa que não sei o motivo... mas em todos os testes que já realizei até hoje com pesquisa e índices, as realizadas com campos "string" foram mais rápidas do que com campos numéricos... Fazer uma select para "filtrar" os produtos com código EAN entre "7896050500001" e "7896050599999" é muito mas rápida se o campo "codigoean" for varchar(13) do que int ... se ele for indexado, mais rápido ainda...Assim, nas tabelas que preciso de mais velocidade de pesquisa, prefiro usar varchar do que int (claro, isso depende de cada situação)...Outra coisa que faz diferença é o uso das subqueries (uso e abuso delas):Isso:select *from (select nome, codigo from `acme`.`clientes` where ultimocontato="2007/05/14" ) as consulta1order by nomeé imensamente mais rápida do queselect nome, codigofrom `acme`.`clientes`where ultimocontato="2007/05/14"order by nomeExperimenta comparar...Quanto ao seu exemplo, mudei a pesquisa para nome (quarenta caracteres em ambas as tabelas) e incluí mais um monte de registros de outras tabelas, de forma que a tabela "alterada" passou a ter 4035 nomes novos...Entãoselect a.nome, a.codigofrom `acme`.`clientes` aleft outer join `warnerbros`.`clientes` bon (a.nome=b.nome)where b.nome is nullfoi igualmente rápida... não me deu sequer condição de dizer que foi um segundo mais lenta do que a primeira...E ressalvo que a tabela clientes tem quatro índices:.codigo varchar(05) not null,nome varchar(40) not null,cnpj varchar(18) not null,cpf varchar(14) not null,..unique index codigo(`codigo`),index nome(`nome`),index cnpj(`cnpj`),index cpf(`cpf`))engine = InnoDB;Isso acelera muito as operações, conforme a necessidade de muita pesquisa e atualizações vinculadas...Ok?Espero ter ajudado! Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabiano R Postado Agosto 29, 2007 Autor Denunciar Share Postado Agosto 29, 2007 (editado) bom dia paulo..realmente não sei oque acontece?a minha consulta demorou quase uma hora pra retornas os dados, fiz o teste no MysqlFrontse puder me adcionar no MSNfabianorsilvestre@hotmail.com Editado Agosto 29, 2007 por Fabiano R Link para o comentário Compartilhar em outros sites More sharing options...
0 paulobergo Postado Agosto 31, 2007 Denunciar Share Postado Agosto 31, 2007 a) Quanto ao MSN, infelizmente, não posso ajudá-lo, pois não tenho autorização para usá-lo...B) Quanto ao MySQLFront: não faço uso dele... uso o SQLExplorer (Borland) e o QueryBrowser do MySQLAdministrator... pode haver alguma dificuldade no MySQLFront em fazer com que a query seja processada apenas pelo MYSQL (essa diferença de tempo eu percebo no SQLExplorer com ODBC quando não defino onde as queries serão processadas: modo "local" ou "server")...c) Experimente executar a query, por exemplo, no prompt do MySQL ou, se usar o Delphi com componentes ZeosLib, dentro de uma zReadOnlyQueryOk? Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Setembro 1, 2007 Denunciar Share Postado Setembro 1, 2007 O que eu quero fazer é comparar os emails das duas tabelas e retornar os email que não existe na tabela compara_email_geraleste tipo de consulta não resultaria no que você procura?SELECT compara_email_novos.email FROM compara_email_novos WHERE not exists(select 1 from compara_email_geral where compara_email_geral.email = compara_email_novos.email); Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Fabiano R
Bom tarde galera...
Bom minha duvida é a seguinte
tenho duas tabelas
compara_email_geral
compara_email_novos
com a estrutura ID email
aonde na tabela compara_email_geral tem cerca de 30 mil emails
e na compara_email_novos cerca de 2 mil.
O que eu quero fazer é comparar os emails das duas tabelas e retornar os email que não existe na tabela compara_email_geral
fiz o teste com a seguinte query
SELECT compara_email_novos.email
FROM compara_email_novos LEFT JOIN compara_email_geral USING(email)
WHERE compara_email_geral.email IS NULL;
deu certo com poucos e-mails mas mas com essa lista.. o servidor trava.
Queria saber se o mysql não tem capacidade pra fazer essa comparação com esse número de dados.
alguém tem uma idéia de como posso fazer isso? algum programa desktop. alguma query?
valeu.
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados