【问题标题】:Add and update column / create new table with the additional row添加和更新列/使用附加行创建新表
【发布时间】:2014-01-07 12:38:19
【问题描述】:

我有两个巨大的表,表 A 中有 1000 万行,表 B 中有 250 万行。两个表都有一个共同的字段 id。表 A 有约 250 列,表 B 有 5 列。表 B 中的所有 id 都存在于表 A 中。我想将表 A 中的字段(日期格式)添加到表 B。我有两个选项,并且都需要大量时间来运行。我想知道哪个会更有效率。

选项 1:
alter table B add column field date;
update B join A using(id) set a.field=b.field;

选项 2:
create table C as select a.*,b.field from B join A using(id);

id 在两个表中都有索引,ENGINE 是 MyISAM。

哪个选项会更快?

我认为 2 因为在选项 1 中,添加一列需要时间,然后在更新时,状态 copy to tmp table 需要大量时间。在选项 1 中,它立即以“发送数据”状态开始。我说的对吗?

另外,我可以用其他更快的方法吗?

【问题讨论】:

  • 方案2会更适合这种场景。
  • 我想我错过了一些东西......但是,你想将日期列从 A 移动到 B 吗?如果是这样,我可以问你为什么要这样做吗?
  • @Melon 对于 B 中的 id,我需要从 A 获取字段(日期格式)。我只需要 B 中的 id,我将把它放入 csv 中其他目的。
  • 我认为您已经放弃了查看选项:CREATE VIEW 'my_view' as select * from B join A on B.id = A.id;,所以您可以运行:select field,any_field from my_view。如果“字段”适合更改,并且将其复制到数据库中,则这是一个不好的选择。 (除非触发以保持更新)

标签: mysql sql database sql-update alter-table


【解决方案1】:

如果您只想选择信息,您可以创建一个视图来收集所有数据

CREATE VIEW 'my_view' as select * from B join A on B.id = A.id;

这样你就可以运行了

select field,any_field from my_view where any_condition;

绝对不推荐在数据库中包含重复数据

我希望这对你有所帮助。因为这不是您的任何选择。


您也可以自行运行查询

 select  field,any_field from B join A on B.id = A.id where any_condition;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2015-09-06
    • 2021-09-16
    • 1970-01-01
    • 2018-06-29
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多