【问题标题】:Is it faster to alter multiple columns in the same query?在同一个查询中更改多个列是否更快?
【发布时间】:2014-04-24 23:16:47
【问题描述】:

在一个查询中添加或删除多个列是否比为每一列执行查询更快?例如,是这样的吗:

ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;

比这更快吗?

ALTER TABLE t2 DROP COLUMN c;
ALTER TABLE t2 DROP COLUMN d;

【问题讨论】:

  • 您是否在高负荷下密集地执行此操作?
  • @Bencaine 这有关系吗?我的意思是你需要多久做一次。几乎从来没有,对吧?
  • 测量并找出...
  • 我猜想在一次操作中完成它会更快,但你应该真正测试两种方式。如果表是空的,那也没关系。

标签: mysql sql alter-table


【解决方案1】:

是的,运行一个 ALTER TABLE 语句应该比运行两个更快。

根据我的经验(在 5.1 和 5.5 上使用 InnoDB),MySQL 似乎没有“就地”修改表。 MySQL 实际上创建了一个新表,作为带有指定修改的旧表的副本。

两个单独的语句需要 MySQL 执行两次复制操作。

通过一条语句,您让 MySQL 有机会通过一次复制操作进行所有更改。 (我不知道 MySQL 内部的细节,但 MySQL 可能实际上做了两次复制。)

其他数据库引擎(MyISAM 等)的处理方式可能不同。


我相信 MySQL (>5.5) 中的 InnoDB 插件和/或更新版本的 InnoDB 具有除“复制”方法之外的一些算法,至少对于一些更改,这允许表在ALTER TABLE 正在运行(用于读取查询)。但我不知道所有细节。

【讨论】:

    【解决方案2】:

    是的,它更快。您只需调用一次数据库 API,它只需解析一次查询。

    但是,对于ALTER TABLE 查询,性能通常不是问题。您不应该经常这样做,只有在重新设计架构时才这样做。

    但是,如果您的问题是关于 UPDATE 查询,例如,它可能会很重要。例如。你应该这样做:

    UPDATE table
    SET col1 = foo, col2 = bar
    WHERE <condition>;
    

    而不是

    UPDATE table
    SET col1 = foo
    WHERE <condition>;
    
    UPDATE table
    SET col2 = bar
    WHERE <condition>;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多