Die Ausführung des MySQL IN-Operators dauert lange
-
21-12-2019 - |
Frage
Ich habe folgende Tabellen:
Table 1 : Contacts
Fields : id first_name
Values :
1 Reeta
2 Rohan
3 John
Table 2 : email (it contains contact_id of contacts table)
Fields : id contact_id email_address
Values :
1 1 r@gmail.com
2 2 r@gmail.com
3 3 j@gmail.com
I want to display all duplicates by email. Like this:
cont_id first_name email_address
1 Reeta r@gmail.com
2 Rohan r@gmail.com
Hier ist meine Anfrage:
select contact_id
from contacts
where email_address IN (
SELECT S.email_address
FROM contacts R
INNER JOIN email
ON R.id = S.contact_id
Group By email_address
Having Count(S.id) > 1
);
Die Ausführung der Abfrage dauert bei einer großen Anzahl von Datensätzen lange.Allerdings funktioniert die innere Abfrage schneller, nicht jedoch die äußere.Bitte helfen Sie.
Lösung
Ja, es ist das Problem mit dem MySQL-Abfrageoptimierer.Die Sache ist - IN (subquery)
für MySQL ist dasselbe wie = ANY ()
Unterabfrage.Und MySQL optimiert das nicht, selbst wenn die Unterabfrage nur wenige Werte zurückgibt, die im Normalfall leicht über den Index verglichen werden können (sofern er in der Spalte vorhanden ist, für die wir arbeiten). IN
).
Verwechseln Sie das nicht mit IN (<static values list>)
- Ganz anders verhält es sich, wenn MySQL damit umgeht IN
nicht als spezifische Art von Unterabfrage, sondern als Vergleichsoperator – und daher Wille Index verwenden.
Daher besteht eine der möglichen Lösungen darin, Ihre Unterabfrage zu trennen, damit sie eine Liste mit Werten zurückgibt, und diese Liste dann durch zu ersetzen IN ()
, wegen der Behandlung wird ein Index-Scan durchgeführt IN
als Vergleichsoperator.In einigen Fällen kann die Lösung jedoch durch Ersetzen der Unterabfrage durch erreicht werden JOIN
.Dies ist nicht in allen Fällen möglich, daher ist die oben beschriebene Lösung für häufige, nicht triviale Fälle geeignet.