Sie haben gefragt, warum, anstatt für Optionen, wie man es schneller macht. Die kurze Antwort ist, dass dies kein Bereich ist, in dem der MySQL-Parser gut optimiert ist. Einfacher ausgedrückt, die Leistung von Unterabfragen in MySQL ist erbärmlich.
Das ist nicht streng richtig, aber durch bittere gelernte Erfahrung ist es ungefähr 90% der Zeit wahr. [1] [2] In fast jeder anderen Datenbank reduziert der relationale Kalkül, wenn möglich, Unterabfragen, einschließlich Oracle, PosgreSQL, SQL Server und SQLite (keine erschöpfende Liste, sondern die DBs, mit denen ich die meiste Erfahrung habe). Und der Grund ist reine Entwicklungszeit auf der relationalen Theorie.
Für MySQL ist dies ein "gotcha" Bereich, den Sie nur bei der Formulierung Ihrer Abfragen beachten müssen. Versuchen Sie im Allgemeinen (nicht immer) Unterabfragen zu vermeiden. Verwenden Sie JOINs, mehrere Abfragen und any reference that helps.
Und für spezifische Hilfe bei Ihren Anfragen und Datensätze, verwenden Sie die EXPLAIN operator:
EXPLAIN SELECT SUM(column_2) FROM table1 WHERE column_1 IN
(SELECT column_1 FROM table2 WHERE column_3 = 'foo');
[1] MySQL Limitations Part 3: Subqueries
[2] When the subselect runs faster, ab 2010 (aber noch eine gute Analyse)
Wie wäre es mit dem Teilen von Ausführungsplänen? ('EXPLAIN EXTENDED') – rkosegi
Wenn Sie sie einzeln ausführen, werden nur 2 Abfragen ausgeführt. Wenn Sie eine als verschachtelte Unterabfrage ausführen, wird sie für jede Zeile der übergeordneten Abfrage ausgeführt. –