2017-07-25 4 views
0

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; 
+1

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

+0

@duffymo Sorry, ich habe vergessen zu erwähnen, ich habe bereits einen Index für Tag-Spalte für beide Tabellen hinzugefügt. – Xiaomeng

+0

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

Antwort

1

Ich würde versuchen, zusammengesetzten Index auf (Tag, ID) für beide Tabellen in dieser Reihenfolge.

Überprüfen Sie mit Ausführungsplan, wenn dieser Index abgeholt wird.

Partitionierungstabelle auf Tag-Spalte könnte Hilfe, wie Partition erstellt intern mehrere kleinere Tabellen.

Auch sollten Sie dies ausführen und überprüfen, wo Ihr Prozess SHOW FULL PROCESSLIST

klemmt Dass Sie führt weiter geben könnten.

0

"Inflation-Deflate-Syndrom" passiert, wenn Sie JOIN...GROUP BY tun. Und es führt normalerweise zu falschen (hohen) Werten für Aggregate (COUNT, SUM, usw.).

Ich bin zu verwirrt darüber, was die Abfrage tun soll, um Ihnen zu helfen, es neu zu schreiben. Kannst du es ausarbeiten? Warum LEFT? Was ist "überlappend"?

Manchmal ist die Abhilfe, wie etwas zu tun ist:

SELECT df1.some_stuff, 
     (SELECT COUNT(*) FROM df2 WHERE Tag = df1.Tag) AS overlapping 
    FROM df1; 

Enthält diese auch nur annähernd zu dem, was Sie wollen?

+0

was ich eigentlich versuche zu tun, ist dies: https://stackoverflow.com/questions/45024037/how-to-merge-by-a-column-of-collection-using-python-pandas. Anfangs versuchte ich Python-Pandas zu verwenden, die von der angenommenen Antwort vorgeschlagen wurden. Der letzte Schritt (Übereinstimmung df1 mit df2) war jedoch problematisch. Also entschied ich mich für den letzten Schritt mit MySQL. – Xiaomeng

+0

'' Ein weiterer Fall von Software von Drittanbietern, der in die Quere kommt? '' –

Verwandte Themen