Mysql επιλέξετε να μην όπου στον πίνακα

ψήφοι
50

Έχω 2 πίνακες (Α και Β) με τα ίδια κύρια κλειδιά. Θέλω να επιλέξετε όλα γραμμής που βρίσκονται σε Α και όχι στο Β Τα ακόλουθα έργα:

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

ωστόσο φαίνεται αρκετά κακή (~ 2 sec σε μόνο 100k σειρές στις Α και 3-10k λιγότερο σε Β)

Υπάρχει καλύτερος τρόπος για να τρέξει αυτό; Ίσως ως αριστερό ενταχθούν;

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

Από τα στοιχεία μου αυτή φαίνεται να τρέξει λίγο πιο γρήγορα (~ 10%), αλλά τι γίνεται σε γενικές γραμμές;

Δημοσιεύθηκε 09/12/2008 στις 20:52
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
50

Νομίζω ότι η τελευταία δήλωση σας είναι ο καλύτερος τρόπος. Μπορείτε επίσης να δοκιμάσετε

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null
Απαντήθηκε 09/12/2008 στις 21:09
πηγή χρήστη

ψήφοι
35

Χρησιμοποιώ ερωτήματα με τη μορφή του δεύτερου παραδείγματος σας. Ένας σύνδεσμος είναι συνήθως πιο επεκτάσιμο από μια συσχετισμένη υποερώτημα.

Απαντήθηκε 09/12/2008 στις 21:47
πηγή χρήστη

ψήφοι
2

Ενώνει είναι γενικά πιο γρήγορα (σε MySQL), αλλά θα πρέπει επίσης να εξετάσει σύστημα ευρετηρίασης σας αν διαπιστώσετε ότι είναι ακόμα κινείται αργά. Σε γενικές γραμμές, κάθε ρύθμιση στον τομέα ως ξένο κλειδί (χρησιμοποιώντας InnoDB) θα έχουν ήδη ένα σύνολο δεικτών. Εάν χρησιμοποιείτε MyISAM, βεβαιωθείτε ότι τυχόν στήλες στην κατάσταση ON αναπροσαρμόζονται, και να εξετάσει επίσης την προσθήκη τυχόν στήλες στον όρο WHERE μέχρι το τέλος του δείκτη, να το δείκτη κάλυψης κάνουν. Αυτό επιτρέπει στον κινητήρα να έχει πρόσβαση σε όλα τα δεδομένα που απαιτούνται στο δείκτη, καταργώντας την ανάγκη να κάνει ένα δεύτερο γύρο-ταξίδι πίσω στο αρχικό δεδομένα. Λάβετε υπόψη ότι αυτό θα επηρεάσει την ταχύτητα των ενθέτων / ενημερώσεις / διαγραφές, αλλά μπορεί να αυξήσει σημαντικά την ταχύτητα του ερωτήματος.

Απαντήθηκε 28/09/2010 στις 22:58
πηγή χρήστη

ψήφοι
2

Επίσης χρησιμοποιώ το αριστερό ενώνεται με ένα «όπου table2.id είναι null» κριτήρια τύπου.

Σίγουρα φαίνεται να είναι πιο αποτελεσματική από την επιλογή ένθετη ερώτημα.

Απαντήθηκε 27/05/2009 στις 15:52
πηγή χρήστη

ψήφοι
-2

Αυτό με βοήθησε πολύ. Joinsείναι πάντα πιο γρήγορα από ό, τι Επιμέρους Ερωτήματα για να δώσει αποτελέσματα:

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 ;
Απαντήθηκε 14/12/2015 στις 10:25
πηγή χρήστη

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