|
执行操作 |
允许ALGORITHM=INPLACE |
是否拷贝表 |
允许并发DML |
允许并发查询 |
备注和注意事项 |
create index
add index |
Yes* |
No* |
Yes |
Yes |
对于全文索引,有一些限制,具体看下一行。目前,该操作不是在原地执行,需要拷贝表. |
add fulltext index |
Yes |
No* |
No |
Yes |
创建第一个全文索引涉及到拷贝表,除非有使用FTS_DOC_ID列。后面的全文索引则在原地执行。 |
drop index |
Yes |
No |
Yes |
Yes |
|
optimize table |
Yes |
Yes |
Yes |
Yes |
在MySQL5.6.17里使用 ALGORITHM=INPLACE.
如果设置old_alter_table=1或使用mysqld –skip-new选项,则使用 ALGORITHM=COPY.
如果表使用了全文索引,则 ALGORITHM=INPLACE不适用 |
set default value for column |
Yes |
No |
Yes |
Yes |
修改.frm文件,不涉及数据文件 |
change auto-increment value |
Yes |
No |
Yes |
Yes |
修改存储到内存的一个值,不修改数据文件 |
add foreign key constraint |
Yes* |
No* |
Yes |
Yes |
禁用foreign_key_checks,则可以避免拷贝表 |
drop forgien key constraing |
Yes |
No |
Yes |
Yes |
foreign_key_checks可以禁用或开启 |
rename column |
Yes* |
No* |
Yes* |
Yes |
允许并发DML,保持相同的数据类型,仅改变字段名 |
add column |
Yes |
Yes |
Yes* |
Yes |
增加auto-increment字段时不允许DML操作.
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵. |
drop column |
Yes |
Yes |
Yes |
Yes |
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵. |
reorder columns |
Yes |
Yes |
Yes |
Yes |
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵. |
change ROW_FORMAT
property |
Yes |
Yes |
Yes |
Yes |
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵. |
change KEY_BLOCK_SIZE
property |
Yes |
Yes |
Yes |
Yes |
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵. |
make column null |
Yes |
Yes |
Yes |
Yes |
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵. |
make cplumn not null |
Yes* |
Yes |
Yes |
Yes |
当SQL_MODE为strict_all_tables,如果执行的列包含null,则会执行失败。
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵. |
change data type
of column |
No |
Yes |
Yes |
Yes |
|
add primary key |
Yes* |
Yes |
Yes |
Yes |
虽然ALGORITHM=INPLACE可以允许,
但是数据要重组,代价比较昂贵.
如果列必须转换为非空的条件下,
ALGORITHM=INPLACE是不允许的。 |
drop primary key
and add other |
Yes |
Yes |
Yes |
Yes |
当在同一个alter table新增主键时ALGORITHM=INPLACE是允许的.数据要重组,因此代价比较昂贵.
|
drop primary key |
No |
Yes |
No |
Yes |
删除主键但是又不新增主键是被限制的 |
convert character set |
No |
Yes |
No |
Yes |
如果新的字符编码不同将会重建表 |
specify character set |
No |
Yes |
No |
Yes |
如果新的字符编码不同将会重建表 |
rebulid with
force option |
Yes |
Yes |
Yes |
Yes |
在MySQL5.6.17里使用 ALGORITHM=INPLACE.
如果设置old_alter_table=1或使用mysqld –skip-new选项,则使用 ALGORITHM=COPY.
如果表使用了全文索引,则 ALGORITHM=INPLACE不适用 |
rebulid with
“null”
alter table …
engine=innodb |
Yes |
Yes |
Yes |
Yes |
在MySQL5.6.17里使用 ALGORITHM=INPLACE.
如果设置old_alter_table=1或使用mysqld –skip-new选项,则使用 ALGORITHM=COPY.
如果表使用了全文索引,则 ALGORITHM=INPLACE不适用 |