MySQL 5.6声称DDL操作将以最大可能的并发性运行。 http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html
“允许并发DML?”列显示可以完全在线执行哪些操作;首选值为“是”。您可以指定LOCK = NONE以断言在DDL期间允许完全并发,但MySQL会尽可能自动允许此级别的并发。当允许并发DML时,也始终允许并发查询。
但是我只是尝试了“ALTER TABLE ADD COLUMN ...”语句,并且该表在此操作期间显示为已锁定。 当我重新声明并附加“,ALGORITHM = inplace,LOCK = none”时,它需要更长的时间,但表仍然可以使用。我认为MySQL会使用特定语句的最高并发级别,那为什么我必须明确指定它们呢?
答案 0 :(得分:3)
Online DDL 允许并发DML这一事实并不一定意味着默认情况下它会抓住每个机会。
关于“尽可能允许这种并发性”的语言有点难以解释。您可以假设MySQL 始终在可能的情况下使用inplace算法,但反过来考虑它:它实际上意味着它在不可能时不允许使用inplace算法。如果可以使用inplace DDL,它允许它,但实际上并不使用该算法,除非你提出请求。
您发现自己在线DDL速度较慢。使用更快的方法不是一个合理的默认值(因为大多数人希望事情更快)?毕竟,该表可能足够小,非就地ALTER将花费不到1秒,因此它不会中断。在可能的所有情况下启用inplace ALTER会使它们在默认情况下花费更长时间 。