2017-07-25 88 views
0

我想与df2加入表df1。问题是,df2是一个非常长的表,有四千万观察值,而且在等待超过48小时后我无法在MySQL中获得连接结果。所以我想问问是否有任何方法可以提高这种连接的效率。我已经为两个表格的标签列添加了一个索引。如何提高MySQL连接效率?

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可以是唯一标识的密钥。我需要的是在列标签上省略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; 
+1

在这些列上添加索引。这将有所帮助。在这之前,运行EXPLAIN PLAN并查找表扫描。如果你看到一个,你会知道添加索引将会有所帮助。 – duffymo

+0

@duffymo对不起,我忘了提及之前,我已经在两个表格的标签列上添加了一个索引。 – Xiaomeng

+0

4000万行?你完蛋了。您需要在该大表上过滤以减小JOIN的大小。 – duffymo

回答

1

我会尝试这两个表上的(标签,ID)组合索引的顺序。

如果检索到此索引,请使用执行计划进行检查。

标签列上的分区表可能帮助,因为分区内部创建多个较小的表。你

还应该运行这一点,并检查您的过程中被卡住 SHOW FULL PROCESSLIST

这可能给你进一步的线索。

0

当你做JOIN...GROUP BY时会发生“充气 - 放气综合征”。它通常会导致聚合错误(高)值(COUNT,SUM等)。

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

有时候,解决办法是做这样的事情:

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

这是否甚至接近你想要什么?

+0

我实际上想要做的是:https://stackoverflow.com/questions/45024037/how-to-merge-by-a-column-of-collection-using-python-pandas。最初,我试图使用被接受的答案提出的Python熊猫。但是,最后一步(与df2匹配df1)存在问题。所以我决定用MySQL来完成最后一步。 – Xiaomeng

+0

''第三方软件阻碍另一种情况? '' –