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不会用到正在创建的索引

  

 

posted @ 2022-08-11 13:11  不忘初心2021  阅读(1006)  评论(0编辑  收藏  举报