赞
踩
1、CREATE INDEX,DROP INDEX
2、ADD COLUMN,DROP COLUMN
MySQL 5.6后大大增强了ONLINE DDL功能,典型就是上面的2个方面, 首先ADD COLUMN和DROP COLUMN不再会堵塞DML操作,同时建立索引 方面默认使用LOCK=NONE的模式而不会堵塞DML,LOCK有4个模式 默认NONE,可选SHARED和exclusive以及DEFAULT, 在LOCK=NONE模式下这种情况和Oracle的CREATE INDEX ONLINE极为相似,在5.6.19上测试就连如果CREATE INDEX LOCK=NONE的时候有一个事物没有提交或者正在进行,也是不能建立索引的,ORACLE也是一样的,换句话说ORACLE和MYSQL都会在建立索引初期试图或者一个X独占的锁,一旦获取后立即降级,但是MYSQL的这个等待过程会堵塞SELECT,我们知道ORACLE里面任何情况下是不会堵塞SELECT的。下面分别说明;
1、CREATE INDEX (在线) 在有事物没有提交的情况下
ORACLE 11.2.0.3测试CREATE INDEX ONLINE
首先在表中插入一条数据,不要提交
insert into testti select * from testti where rownum<=1;
然后另外开启一个会话进行
create index test_in on testti(username) online;
此时CREATE INDEX 被堵塞,查看V$LOCK
SID TYPE LMODE REQUEST BLOCK
---------- ---- ---------- ---------- ----------
48 TX 0 4 0
48 TM 2 0 0
48 TM 4 0 0
48 TX 6 0 0
53 TM 3 0 0
53 TX 6 0 1
可以看到SID 53堵塞了SID 48,SID 48试图获取MODE 4的锁的时候被一个MODE 6的TX锁堵塞
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。