innodb status
?---TRANSACTION 462658, not started
?MySQL thread id 2, OS thread handle 0x40671940, query id 445 localhost root Waiting for table metadata lock
?alter table testno add m int(10)
?---TRANSACTION 462663, ACTIVE 45 sec
?1 lock struct(s), heap size 360, 0 row lock(s), undo log entries 1
?MySQL thread id 1, OS thread handle 0x40430940, query id 443 localhost root cleaning up
在没有事物的情况下:
ORACLE如果不指定默认值,增加字段非常快,机会瞬间完成,所以不存在堵塞的情况。
?如果是
alter table testti add test varchar2(20) default 'test1';
然后另外开启一个会话
insert into testti select * from testti where rownum<=1;
?ORACLE等待时间为:
library cache lock
?MYSQL在这方面貌似做得更好,ADD COLUMN不会堵塞任何DDL,他会把期间的操作放入
innodb_online_alter_log_max_size ,等待完成后同步回来,实际上ORACLE和MYSQL
在CREATE INDEX ONLINE的情况下都是使用了这个机制,都是将修改放入一个临时的
?区域完成后进行同步来完成一致性,ORACLE是将临时记录记录到SYS_JOURNAL_****表里面?
只是ORACLE在ADD COL的情况下应该是没有使用的,因为如果没有默认值ORACLE的
?增加COL是非常快的,但是MYSQL有无默认值是一样的。
?会话1:
mysql> alter table testno add m int(10) default 0;
?Query OK, 0 rows affected (43.97 sec)
?Records: 0? Duplicates: 0? Warnings: 0
会话2:
mysql> insert into testno values(122,'test1');
?Query OK, 1 row affected (0.00 sec)
插入不受影响。
5、drop col
?drop col ORACLE和MYSQL都和ADD COL带默认值的方式没有太多的区别,ORACLE在没有事物的情况
?下任然会堵塞会话等待为
enq: TM - contention
?MYSQL则不会,但是MYSQL可能的需要重组表类似ORACLE的MOVE TABLE,还需考证