如何提高 MySQL join 的效率? | 珊瑚贝

How to improve MySQL join to be more efficient?


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

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

1
2
3
4
5
6
7
8
9
10
|Id        |Tag
| ——— | ——————————————–
|1         |c#
|1         |winforms
|1         |typeconversion
|1         |decimal
|2         |.net
|2         |decimal
|3         |.net
|3         |math

两个表都有两列,Id 和 Tag。但是,Id 或 Tag 都不是唯一标识的键。只有 Id Tag 可以是唯一标识的密钥。我需要的是在列标签上省略加入 df1 和 df2。这是我的代码:

1
2
3
4
5
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;
  • 在这些列上添加索引。这会有所帮助。在此之前,请运行 EXPLAIN PLAN 并查找表扫描。如果您看到一个,您就会知道添加索引会有所帮助。
  • @duffymo 抱歉,我之前忘了提,我已经在两个表的 Tag 列上添加了索引。
  • 4000 万行?你完蛋了。您需要对该大表进行过滤以减小 JOIN 的大小。


我会按此顺序对两个表的 (tag, id) 尝试复合索引。

如果该索引被拾取,请使用执行计划检查。

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

你也应该运行它并检查你的进程卡在哪里
SHOW FULL PROCESSLIST

这可能会给你更多的线索。


“inflate-deflate syndrome” 发生在您执行 JOIN…GROUP BY 时。它通常会导致聚合(COUNT、SUM 等)的错误(高)值。

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

有时解决方法是:

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

这甚至接近你想要的吗?

  • 我实际上想做的是:stackoverflow.com/questions/45024037/…。最初我试图使用接受的答案提出的 Python pandas。但是,最后一步(将 df1 与 df2 匹配)是有问题的。所以我决定使用 MySQL 来做最后一步。
  • <snide-remark> 又一个第 3 方软件阻碍的案例? </snide-remark>


来源:https://www.codenong.com/45292122/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9435.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?