mysql和oracle中需要添加索引如何处理锁表问题?
oracle中添加索引的时候加入online
在线方式创建索引,即使用online创建索引:CREATE INDEX 索引名 ON 表名(列名) online;
在线方式创建索引,锁的是行而非表,通过临时表进行索引的创建,所以不会影响DML操作,创建索引的速度慢一些
非在线方式创建索引,锁表,优先创建索引,此时DML都被阻塞,所以速度快。
MySQL5.6版本开始支持在线创建--Online DDL
ALTER TABLE table_name ADD INDEX , indea_name ,ALGORITHM=INPLACE,LOCK=NONE
ALGORITHM指定创建或删除索引得算法,有以下几类
COPY:按照5.1之前的版本,创建临时表的方式 INPLACE:不需要创建临时表 DEFAULT:表示根据参数old_alter_table来判断是用COPY还是INPLACE,默认OFF,表示采用INPLACE方式
LOCK表示加锁情况:
NONE:不添加任何锁,允许并发 SHARE:加S锁 EXCLUSIVE:加X锁,读写都不允许 DEFAULT:会先判断是否可用NONE,若不能再判断是否可用SHARE模式,最后判断EXCLUSIVE
Online DDL的原理
在创建或删除索引的同时,会将这段时间发生的增删改操作的日志写入一个缓存中,待完成索引后再重新将日志应用到表上,达到数据一致性。这个缓存的小由innodb_online_alter_log_max_size控制,默认128MB。可以根据情况调整 需要注意的是,在这个过程中,sql不会用到正在创建的索引