将列从一个表添加到另一个表的正确 MySQL 方法

Posted

技术标签:

【中文标题】将列从一个表添加到另一个表的正确 MySQL 方法【英文标题】:Proper MySQL way to add a column from one table to another 【发布时间】:2011-03-06 21:28:42 【问题描述】:

我有一个大表(约 1000 万条记录),其中包含多个指向其他较小表的键。每个较小的表中的键都是唯一的,但在大表中却不是。我想根据键匹配从一个较小的表中向大表中添加一列,但我不确定这样做的“正确”方法。我有一个可行的解决方案,但它需要相当长的时间(认为这可能是不可避免的),而且通常感觉这不是最佳的方法。这是我所拥有的:

CREATE TABLE new_big_table LIKE big_table;
ALTER TABLE new_big_table ADD(new_column TINYINT NOT NULL);
INSERT INTO new_big_table SELECT big_table.*, smaller_table.my_column
  FROM big_table JOIN smaller_table ON big_table.key1 = smaller_table.key1
  AND big_table.key2 = smaller_table.key2;

这样就完成了工作,但闻起来真的像是我做错了。似乎至少我不需要创建表的副本来完成这项工作。有没有更直接(更有效?)的方法?

值得一提的是,这是针对家庭中的个人爱好项目,因此我可以随意占用机器的所有资源(因为我是唯一使用它的人)。因此,如果有任何直接的性能调整技巧来做这样的事情,我将不胜感激(我正在 Amazon EC2 实例上对此进行试验,因为它应该比我的个人桌面更快并且内存更多) .

【问题讨论】:

【参考方案1】:

您是否尝试就地添加列?

alter table big_table add new_column tinyint;

update  big_table bt
join    smaller_table st
on      bt.key1 = st.key1
        and bt.key2 = st.key2
set     bt.new_column = st.my_column;

alter table big_table modify new_column tinyint not null;

【讨论】:

不,我没试过;当涉及选择时,我不熟悉更新语法。我觉得你建议的东西可能存在,所以假设它做了我认为它做的事情,这可能正是我想要的...... @Michael McGowan:刚刚记得你实际上可以在 mysql 更新语句中 join... 答案改进了 :) 这似乎产生了与我相同的结果,并且不需要创建新表更干净。奇怪的是,它花了更长的时间。您的update 比我的insert 稍快,但添加空白列big_table 需要相当长的时间。这是否表明我在其他方面做得不好? @Michael McGowan:添加列可能需要进行表重组,这比复制整个表更昂贵。对我来说听起来很正常,我不会将其视为某事做得不好的指标。 大型表上的 Alter 语句是非常昂贵的查询。 alter 语句制作表的副本,执行更改,删除原始表并重命名临时表以替换原始表。正如您可以想象的那样,当您进入数百万行时会产生大量磁盘 IO。

以上是关于将列从一个表添加到另一个表的正确 MySQL 方法的主要内容,如果未能解决你的问题,请参考以下文章

将列从一个 datagridview 和结果添加到另一个 datagridview

Pandas 基于连接将列从一个数据帧添加到另一个数据帧

如何将列从一个 CSV 文件复制到另一个 CSV 文件?

使用 PowerShell 将列从一个 csv 文件复制到另一个

基于唯一对组合将列从一个文件合并到另一个文件

将列从一个DataFrame复制到另一个DataFrame会产生NaN值吗?