0

我正在尝试将表 df1 与 df2 连接起来。问题是 df2 是一个非常长的表,有 4000 万个观察值,在等待超过 48 小时后,我无法在 MySQL 中获得连接结果。所以想问问有没有什么办法可以提高这个join的效率。我已经在两个表的 Tag 列上添加了索引。

df1 和 df2 具有相同的结构,这里是一个示例:

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

两个表都有两列,Id 和 Tag。但是,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 回答
0

当您这样做时,就会发生“充气-放气综合症” JOIN...GROUP BY。它通常会导致聚合( 、 等)的错误(高)COUNTSUM

我对查询应该做什么来帮助您重写它感到困惑。你能详细说明吗?为什么LEFT?什么是“重叠”?

有时解决方法是执行以下操作:

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

这甚至接近你想要的吗?

于 2017-07-25T02:40:39.147 回答