Unterabfragen mit EXISTS vs IN - MySQL
Unten sind zwei Abfragen Unterabfragen. Beide sind gleich und beide funktionieren gut für mich. Das Problem ist jedoch, dass die Ausführung der Abfrage von Methode 1 etwa 10 Sekunden dauert, während die Abfrage von Methode 2 weniger als 1 Sekunde dauert.
Ich konnte die Abfrage von Methode 1 in Methode 2 konvertieren, verstehe jedoch nicht, was in der Abfrage vor sich geht. Ich habe versucht, es selbst herauszufinden. Ich möchte wirklich erfahren, was der Unterschied zwischen den beiden folgenden Abfragen ist und wie der Leistungszuwachs erfolgt. Was ist die Logik dahinter?
Ich bin neu in diesen fortgeschrittenen Techniken. Ich hoffe, jemand hilft mir hier raus. Da ich das gelesen habedocs das gibt mir keinen hinweis.
Methode 1 :
SELECT
*
FROM
tracker
WHERE
reservation_id IN (
SELECT
reservation_id
FROM
tracker
GROUP BY
reservation_id
HAVING
(
method = 1
AND type = 0
AND Count(*) > 1
)
OR (
method = 1
AND type = 1
AND Count(*) > 1
)
OR (
method = 2
AND type = 2
AND Count(*) > 0
)
OR (
method = 3
AND type = 0
AND Count(*) > 0
)
OR (
method = 3
AND type = 1
AND Count(*) > 1
)
OR (
method = 3
AND type = 3
AND Count(*) > 0
)
)
Methode 2:
SELECT
*
FROM
`tracker` t
WHERE
EXISTS (
SELECT
reservation_id
FROM
`tracker` t3
WHERE
t3.reservation_id = t.reservation_id
GROUP BY
reservation_id
HAVING
(
METHOD = 1
AND TYPE = 0
AND COUNT(*) > 1
)
OR
(
METHOD = 1
AND TYPE = 1
AND COUNT(*) > 1
)
OR
(
METHOD = 2
AND TYPE = 2
AND COUNT(*) > 0
)
OR
(
METHOD = 3
AND TYPE = 0
AND COUNT(*) > 0
)
OR
(
METHOD = 3
AND TYPE = 1
AND COUNT(*) > 1
)
OR
(
METHOD = 3
AND TYPE = 3
AND COUNT(*) > 0
)
)