如何提高MySQL连接效率?
我想与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;
我会尝试这两个表上的(标签,ID)组合索引的顺序。
如果检索到此索引,请使用执行计划进行检查。
标签列上的分区表可能帮助,因为分区内部创建多个较小的表。你
还应该运行这一点,并检查您的过程中被卡住 SHOW FULL PROCESSLIST
这可能给你进一步的线索。
当你做JOIN...GROUP BY
时会发生“充气 - 放气综合征”。它通常会导致聚合错误(高)值(COUNT
,SUM
等)。
我对查询应该做什么来帮助您重写它感到困惑。你能详细说明吗?为什么LEFT
?什么是“重叠”?
有时候,解决办法是做这样的事情:
SELECT df1.some_stuff,
(SELECT COUNT(*) FROM df2 WHERE Tag = df1.Tag) AS overlapping
FROM df1;
这是否甚至接近你想要什么?
我实际上想要做的是:https://stackoverflow.com/questions/45024037/how-to-merge-by-a-column-of-collection-using-python-pandas。最初,我试图使用被接受的答案提出的Python熊猫。但是,最后一步(与df2匹配df1)存在问题。所以我决定用MySQL来完成最后一步。 – Xiaomeng
'
在这些列上添加索引。这将有所帮助。在这之前,运行EXPLAIN PLAN并查找表扫描。如果你看到一个,你会知道添加索引将会有所帮助。 – duffymo
@duffymo对不起,我忘了提及之前,我已经在两个表格的标签列上添加了一个索引。 – Xiaomeng
4000万行?你完蛋了。您需要在该大表上过滤以减小JOIN的大小。 – duffymo