0

テーブル df1 を df2 に結合しようとしています。問題は、df2 が 4000 万の観測値を持つ非常に長いテーブルであり、48 時間以上待機した後、MySQL で結合された結果を取得できないことです。そこで、この結合の効率を改善する方法があるかどうかを尋ねたいと思います。両方のテーブルのタグ列にインデックスを追加しました。

df1 と df2 は同じ構造を持ち、以下に例を示します。

|Id        |Tag
| -------- | --------------------------------------------
|1         |c#
|1         |winforms
|1         |type-conversion
|1         |decimal
|2         |.net
|2         |decimal
|3         |.net
|3         |math

どちらのテーブルにも、Id と Tag の 2 つの列があります。ただし、Id も Tag も一意に識別されるキーではありません。Id+Tag のみが一意に識別されるキーになります。私が必要とするのは、タグ列の結合 df1 と df2 を除外することです。そして、ここに私のコードがあります:

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;
4

2 に答える 2

1

この順序で両方のテーブルに対して (tag, id) の複合インデックスを試してみます。

このインデックスが取得される場合は、実行計画を使用して確認してください。

パーティションは内部的に複数の小さなテーブルを作成するため、タグ列でテーブルをパーティション分割すると役立つ場合があります。

また、これを実行して、プロセスがスタックする場所を確認する必要があります SHOW FULL PROCESSLIST

それはあなたにさらなる手がかりを与えるかもしれません。

于 2017-07-25T01:17:12.090 に答える