2017-10-26 2 views
0

Warum diese Abfrage:Warum ist diese MySQL-Abfrage schneller, wenn sie einzeln ausgeführt wird?

select sum(column_2) from table1 where column_1 in 
(select column_1 from table2 where column_3 = 'foo'); 

mehrere Minuten in Anspruch nimmt, so auszuführen, wenn ich die beiden Abfragen einzeln ausführen soll so schneller mehr?

Zum Beispiel:

select column_1 from table2 where column_3 = 'foo' Ergebnisse xxx

select sum(column_2) from table1 where column_1 in (xxx); 
+0

Wie wäre es mit dem Teilen von Ausführungsplänen? ('EXPLAIN EXTENDED') – rkosegi

+1

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. –

Antwort

0

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)

+0

Genau, ich fragte warum, nicht wie man optimiert ... – dellasavia

+0

'IN (SELECT ...)' fast immer schlecht funktioniert. Normalerweise besteht die Problemumgehung darin, einen 'JOIN' zu verwenden. –

2

Sie sollten verschachtelte Abfragen für eine bessere Leistung zu vermeiden, können Sie es umschreiben als:

select sum(column_2) 
from table1 t1 
inner join table2 t2 
on t1.column_1 = t2.column_1 
where column_3 = 'foo'; 

MySQL Docs Zitiert:

It can be more efficient to make use of some of these techniques rather than to use subqueries

Zum Beispiel dieser Abfrage:

SELECT * FROM t1 WHERE id IN (id FROM t2 SELECT);

werden kann neu geschrieben als:.

DISTINCT t1 SELECT * FROM T1, T2 WHERE t1.id = t2.id;

Verwandte Themen