mysql以优化的方式将多列添加到大表中

mysql以优化的方式将多列添加到大表中,mysql,database,algorithm,innodb,in-place,Mysql,Database,Algorithm,Innodb,In Place,我想在一个大型MySQLVersion5.6表中添加8个新列,innodb有数百万条记录。我正试图以最优化的方式实现这一目标 与在8个不同的查询中添加8列相比,使用单个查询添加所有列是否有任何优势。如果有,我想知道原因 在指定ALGORITHM=INPLACE、LOCK=NONE时,我需要注意的所有事情,以便它不会导致任何数据损坏或应用程序失败 我正在用查询测试ALGORITHM=INPLACE,LOCK=NONE ALTER TABLE table_test ADD COLUMN test_c

我想在一个大型MySQLVersion5.6表中添加8个新列,innodb有数百万条记录。我正试图以最优化的方式实现这一目标

与在8个不同的查询中添加8列相比,使用单个查询添加所有列是否有任何优势。如果有,我想知道原因

在指定ALGORITHM=INPLACE、LOCK=NONE时,我需要注意的所有事情,以便它不会导致任何数据损坏或应用程序失败

我正在用查询测试ALGORITHM=INPLACE,LOCK=NONE

ALTER TABLE table_test ADD COLUMN test_column TINYINT UNSIGNED DEFAULT 0 ALGORITHM=INPLACE LOCK = NONE;
但它所用的时间与使用ALGORITHM=DEFAULT运行的查询所用的时间相同。原因可能是什么

正在更改的表只有主键索引,没有其他索引。从应用程序中,此表的查询如下:

insert into table;
select * from table where user_id=uid;
select sum(column) from table where user_id=id and date<NOW();

你说的优化是指最快的吗?还是对其他查询影响最小

在旧版本中,不使用附加组件的最佳方式是将所有附加列放在一个ALTER表中;然后等到它完成

在任何版本中,pt online schema change都将添加所有列,只需短暂的停机时间

既然您提到ALGORITHM=INPLACE,LOCK=NONE,我想您使用的是更新的版本?因此,8个改变可能是最佳选择。会有一些干扰,但可能不会太多

ALGORITHM=DEFAULT允许服务器选择最佳算法。这几乎总是最好的。也就是说,除了违约之外,几乎不需要说什么

你永远不会得到数据损坏。在最坏的情况下,查询可能会由于ALTERs的干扰而导致某种超时而失败。你应该经常检查错误,包括超时,并在你的应用程序中处理它

要讨论这些问题

insert into table;
一次一排?还是成批?批处理的效率更高——可能是10倍

select * from table;
当然不是!这将为您提供数百万行的所有列。你为什么要这么做

select count(column) from table where pk=id and date<NOW();
COUNTcol检查col是否不为空-需要吗?如果没有,那么只需计算*


其中pk=id只给出一行;那么,为什么还要使用DateOptimized,我的意思是更快,以及它对实时应用的影响。mysql版本是5.6,我尝试在一个查询中添加多个列,这会更快。即使我在一个查询中添加单列或8列,所花费的时间也是一样的。@bijoshtj-很高兴知道这一点。听起来这就是你想要的答案?关于查询影响,它没有影响上面列出的任何查询。我还是不知道怎么做。这是我在测试环境中测试的结果。我想知道它内部是如何工作的。我找不到任何合适的文档。我添加了内部构件。