Mysql escolha não onde na tabela

votos
50

Eu tenho 2 tabelas (A e B) com as mesmas chaves primárias. Eu quero selecionar todos linha que estão em A e não em B. As seguintes obras:

select * from A where not exists (select * from B where A.pk=B.pk);

no entanto, parece bastante ruim (~ 2 segundos em apenas 100k linhas em um e 3-10k menos em B)

Existe uma maneira melhor para executar este? Talvez como uma associação à esquerda?

select * from A left join B on A.x=B.y where B.y is null;

No meu dados este parece estar a correr um pouco mais rápido (~ 10%), mas que sobre em geral?

Publicado 09/12/2008 em 20:52
fonte usuário
Em outras línguas...                            


5 respostas

votos
50

Eu acho que sua última declaração é a melhor maneira. Você também pode tentar

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null
Respondeu 09/12/2008 em 21:09
fonte usuário

votos
35

I usar consultas no formato do seu segundo exemplo. Uma união é geralmente mais escalável do que uma subconsulta correlacionada.

Respondeu 09/12/2008 em 21:47
fonte usuário

votos
2

Junta são geralmente mais rápido (no MySQL), mas você também deve considerar o seu esquema de indexação se você achar que ele ainda está se movendo lentamente. Geralmente, qualquer configuração de campo como uma chave estrangeira (usando INNODB) já terá um conjunto de índices. Se você estiver usando MYISAM, certifique-se de que quaisquer colunas na instrução ON são indexados, e considerar também a adição de quaisquer colunas na cláusula WHERE para o final do índice, para torná-lo um índice de cobertura. Isso permite que o motor para ter acesso a todos os dados necessários no índice, eliminando a necessidade de fazer um segundo round-trip de volta para os dados originais. Tenha em mente que isso vai impactar a velocidade de inserções / atualizações / exclusões, mas pode aumentar significativamente a velocidade da consulta.

Respondeu 28/09/2010 em 22:58
fonte usuário

votos
2

Eu também uso esquerda junta-se com um "onde table2.id é nulo" critérios de tipo.

Certamente parece ser mais eficiente do que a opção de consulta aninhada.

Respondeu 27/05/2009 em 15:52
fonte usuário

votos
-2

Isso me ajudou muito. Joinssão sempre mais rápido do que Subconsultas para dar resultados:

SELECT tbl1.id FROM tbl1 t1
LEFT OUTER JOIN tbl2 t2 ON t1.id = t2.id 
WHERE t1.id>=100 AND t2.id IS NULL ;
Respondeu 14/12/2015 em 10:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more