【问题标题】:Create Table from inner join extremely slow从内部连接创建表非常慢
【发布时间】:2012-09-03 04:13:28
【问题描述】:

我有如下声明

CREATE TABLE INPUT_OUTPUT 
SELECT T1_C1,.....,T1_C300, T1_PID from T1 
    INNER JOIN (SELECT T2_C1,T2_C2,T2_PID FROM T2) as RESPONSE ON T1.T1_PID=RESPONSE.T2_PID

它的运行速度非常慢 - 现在运行了 5 个小时。这两个表有大约 400 万行和几百列。

我有一台 8 核、64gb ram ubuntu-linux 机器,使用 top 我可以看到 mysql 进程仅在一个内核上使用了 3gb,尽管它的使用率始终保持在 100%。令人不安的是,并非所有内核都在使用。

我想比这更快地创建表。

我应该使用

CREATE TABLE INPUT_OUTPUT LIKE T1

通过为 T2 中相关的列添加额外的列来更改 INPUT_OUTPUT,然后填充它?我不确定这样做的语法以及它是否会导致加速。

【问题讨论】:

  • 我很困惑:子查询没有 PID 列。
  • HPC 与慢速 SQL 查询无关 - 删除了 HPC 标签。

标签: mysql linux performance join


【解决方案1】:

T1_PID 有索引吗?如果是这样,这应该运行得很快。运行查询的 SELECT 部分的 EXPLAIN 并查看它的内容。

也就是说,我不明白您为什么需要子查询。有什么问题:

CREATE TABLE INPUT_OUTPUT 
SELECT T1_C1,.....,T1_C300, T1_PID, T2_C1, T2_C2, T2_PID
FROM T1 INNER JOIN T2 ON T1.T1_PID=T2.T2_PID

如果T1T2 具有PID 索引,则使用后者应该可以工作。

【讨论】:

  • 感谢索引评论,我试试看。似乎我只需要在 T1 (T1_PID) 上创建一个 CREATE INDEX PID。我的表非常大,我将使用 R 查找它们(希望将它们加载到内存中)。我只想加入 T1 的必要部分和 T2。
猜你喜欢
  • 2022-01-12
  • 2015-04-19
  • 1970-01-01
  • 2012-06-17
  • 2013-08-28
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多