MySQL nerede değil tabloda seçtiğiniz

oy
50

Aynı birincil anahtar 2 tablolar (A ve B) bulunur. Ben A ve ardından kapsamlı B'de tüm satırı seçmek istiyorum:

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

ancak (b sadece 100k A'da satır ve 3-10k az üzerinde ~ 2 sn) oldukça kötü görünüyor

Bu çalıştırmak için daha iyi bir yolu var mı? Belki bir sola olarak katılmak?

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

Benim verilerde bu biraz daha hızlı (~% 10) çalıştırmak ama ne genel olarak yaklaşık görünüyor?

Oluştur 09/12/2008 saat 20:52
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
50

Ben son deyimi en iyi yol olduğunu düşünüyorum. Ayrıca deneyebilirsiniz

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null
Cevap 09/12/2008 saat 21:09
kaynak kullanıcı

oy
35

Ben senin ikinci örnekte biçiminde sorgularını kullanabilirsiniz. Bir katılmak genellikle daha ölçeklenebilir bir bağıntılı alt sorgu aşıyor.

Cevap 09/12/2008 saat 21:47
kaynak kullanıcı

oy
2

Katıldı (MySQL) genellikle daha hızlı, ama yine de yavaş hareket ediyor fark ederseniz siz de indeksleme şeması düşünmelisiniz. Genellikle, bir yabancı anahtar (kullanarak innodb) gibi herhangi bir saha kurulumu zaten bir dizin kümesi olacaktır. Eğer myisam kullanıyorsanız, AÇIK açıklamada sütunlar endeksli olduğundan emin olun ve bir örtme endeksi yapmak, aynı zamanda dizinin sonuna WHERE cümleciği herhangi bir sütun eklemeyi düşünün. Bu geri orijinal verilere ikinci gidiş-dönüş yapma ihtiyacını kaldırarak, motor endeksindeki gerekli tüm verilere erişim sağlar. Bu insert / update / siler hızını etkileyecektir, ancak önemli ölçüde sorgu hızını artırabilir unutmayın.

Cevap 28/09/2010 saat 22:58
kaynak kullanıcı

oy
2

Ben de sol bir "table2.id null" tipi kriterlerine katılır kullanın.

Kesinlikle iç içe sorgu seçeneği daha etkili görünmektedir.

Cevap 27/05/2009 saat 15:52
kaynak kullanıcı

oy
-2

Bu bana çok yardımcı oldu. Joinssonuçları vermek üzere Alt Sorgular daima daha hızlıdır:

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 ;
Cevap 14/12/2015 saat 10:25
kaynak kullanıcı

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