Jump to content
Fórum Script Brasil
  • 0

Comparação 30 Mil Registros


Fabiano R
 Share

Question

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 to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

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) quantos

from `acme`.`clientes` a

left outer join `warnerbros`.`clientes` b

on (a.codigo=b.codigo)

where b.codigo is null

gerou

quantos

8

em 2seg, tanto em um Pentium 1.6 512k como num Duron 1.8 392k, ambos com MySQL 5.027...

E...

select a.nome, a.codigo

from `acme`.`clientes` a

left outer join `warnerbros`.`clientes` b

on (a.codigo=b.codigo)

where b.codigo is null

mostrou os nomes e codigos novos...

sendo a = tabela nova com 122356 e b = tabela original com 122348 registros.

Ok? espero ter ajudado!

Link to comment
Share on other sites

  • 0

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 consulta1

order by nome

é imensamente mais rápida do que

select nome, codigo

from `acme`.`clientes`

where ultimocontato="2007/05/14"

order by nome

Experimenta 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ão

select a.nome, a.codigo

from `acme`.`clientes` a

left outer join `warnerbros`.`clientes` b

on (a.nome=b.nome)

where b.nome is null

foi 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 to comment
Share on other sites

  • 0

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 zReadOnlyQuery

Ok?

Link to comment
Share on other sites

  • 0
O que eu quero fazer é comparar os emails das duas tabelas e retornar os email que não existe na tabela compara_email_geral

este 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 to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.5k
×
×
  • Create New...