将列从一个表添加到另一个表的正确 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