Ich habe einige Daten zu überprüfen, jedoch renne ich in einen Roadblock mit einer Abfrage, die nicht zurückkehrt. Was kann ich hier anders machen, da ich wirklich nicht verstehe, dass diese Abfragen zurückkommen (ausgeführt von mysql workbench), selbst nachdem sie mehrere Stunden laufen gelassen wurden? Bin ich gerade unterversorgt?Google Cloud SQL, das Zeilen auswählt, die in einer anderen Tabelle nicht vorhanden sind
Ich habe eine n1-Standard 4 Google Cloud Sql-Instanz (4cpu, 15GB RAM). Die zwei Tabellen sind unten. Es gibt auch einen Index für customer_id für Tabelle 1. Tabelle 2 hat 885481 Zeilen und Tabelle 1 hat 1891653 Zeilen.
Ich habe versucht, drei Varianten einer Abfrage nach Kunden-IDs in Tabelle 1 zu suchen, wo sie in Tabelle 2 nicht vorhanden sind (dargestellt als account_group_id).
Was ich erwartet hätte sein performante und tatsächlich zurück:
Select customer_id
FROM Table1 as a
WHERE NOT EXISTS(
Select account_group_id
FROM Table2 as b WHERE b.account_group_id = a.customer_id
)
Als Sub-Abfrage:
Select customer_id
FROM Table1
WHERE customer_id NOT IN(
Select account_group_id
FROM Table2
)
Als LEFT JOIN:
SELECT customer_id
FROM Table1 as a
LEFT OUTER JOIN Table2 as b ON a.customer_id = b.account_group_id
WHERE b.account_group_id IS NULL
EDIT: Also nach etwas Basteln und tatsächlich mit EXPLAIN vor dem Posten meiner Frage, die Tabelle2 Subq UI führt aus irgendeinem Grund einen FULL TABLE-Scan durch. Ich habe diese Abfrage in meinen Test-/Staging-Umgebungen mit den gleichen Indexpattern ausprobiert, und ich sehe einen Index, der dort sucht. Jetzt bin ich noch mehr verwirrt.
Auch wenn ich einen Force-Index-Hinweis hinzufüge, lehnt der Abfrageoptimierer die Verwendung des Primärschlüssels ab.
Dies ist, was der Abfrage-Plan wie auf meiner Staging-Umgebung aussieht:
Irgendwelche Gedanken darüber, warum dies auftritt?
Tabelle 1:
Tabelle 2:
in der dritten Variante Sie links benötigen beitreten – soft87