Ich versuche, Tabelle df1 mit DF2 beizutreten. Das Problem ist, dass df2 eine sehr lange Tabelle ist, die 40 Millionen Beobachtungen hat und ich das verknüpfte Ergebnis in MySQL nicht bekommen kann, nachdem ich mehr als 48 Stunden gewartet habe. Daher möchte ich fragen, ob es einen Weg gibt, die Effizienz dieser Verbindung zu verbessern. Ich habe bereits einen Index für die Tag-Spalte für beide Tabellen hinzugefügt.Wie verbessert man MySQL Join um effizienter zu werden?
DF1 und DF2 haben die gleiche Struktur und hier ist ein Beispiel:
|Id |Tag
| -------- | --------------------------------------------
|1 |c#
|1 |winforms
|1 |type-conversion
|1 |decimal
|2 |.net
|2 |decimal
|3 |.net
|3 |math
Beide Tabellen haben zwei Spalten, Id und Tag. Weder ID noch Tag sind jedoch eindeutig identifizierte Schlüssel. Nur ID + Tag kann ein eindeutig identifizierter Schlüssel sein. Was ich brauche ist, dass man df1 mit df2 in der Spalte Tag auslässt. Und hier ist mein Code:
CREATE TABLE matched_outcome AS
SELECT df1.Id AS df1_Id, df2.Id AS df2_Id, COUNT(df2.Tag) AS overlapping
FROM df1
LEFT JOIN df2 ON df2.Tag=df1.Tag
GROUP BY df1.Id, df2.Id;
Fügen Sie Indizes für diese Spalten hinzu. Das wird helfen. Bevor Sie dies tun, führen Sie EXPLAIN PLAN aus und suchen Sie nach einem Tabellenscan. Wenn Sie einen sehen, wissen Sie, dass der Index hilft. – duffymo
@duffymo Sorry, ich habe vergessen zu erwähnen, ich habe bereits einen Index für Tag-Spalte für beide Tabellen hinzugefügt. – Xiaomeng
40 Millionen Zeilen? Du bist verrückt. Sie müssen nach dieser großen Tabelle filtern, um die Größe des JOINs zu verringern. – duffymo