如何提高MySQL连接效率?

时间:2017-07-25 00:41:38

标签: mysql join query-optimization longtable

我正在尝试将表df1与df2连接。问题是df2是一个非常长的表,有4000万个观察点,在等待超过48小时后我无法在MySQL中获得结果。所以我想询问是否有任何方法可以提高此连接的效率。我已经在两个表的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可以是唯一标识的密钥。我需要的是在列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;

2 个答案:

答案 0 :(得分:1)

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

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

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

此外,您应该运行此操作并检查您的进程陷入何处 SHOW FULL PROCESSLIST

这可能会给你更多的潜在客户。

答案 1 :(得分:0)

"充气 - 放气综合征"当你JOIN...GROUP BY时发生。它通常会导致聚合(COUNTSUM等)的错误(高)值。

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

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

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

这甚至接近你想要的吗?