其他分享
首页 > 其他分享> > DB-非阻塞事务创建索引

DB-非阻塞事务创建索引

作者:互联网

不阻塞事务创建索引

PG环境

create index 是会阻塞 dml 操作的。在生产环境需要添加 concurrently 参数不阻塞事务创建索引

create index concurrently idx_index_name on table_name(column_name);

CONCURRENTLY 实现原理

使用CREATE INDEX CONCURRENTLY创建索引,分为三个阶段,扫描两次TABLE。

create index CONCURRENTLY需要2次扫描,三次等待。三次等待分别是2次扫描表前,结束创建索引前。

create index CONCURRENTLY idx_tb1_id on tb1 (id);
  1. 开启事务1,拿到当前snapshot1。
  2. 扫描tb1表前,等待所有修改过tb1表(写入、删除、更新)的事务结束。
  3. 扫描tb1表,并建立索引。
  4. 结束事务1。
  5. 开启事务2,拿到当前snapshot2。
  6. 再次扫描tb1表前,等待所有修改过tb1表(写入、删除、更新)的事务结束。
  7. 在snapshot2之后启动的事务对tb1表执行的DML,会修改这个idx_tb1_id的索引。
  8. 再次扫描tb1表,更新索引。(从TUPLE中可以拿到版本号,在snapshot1到snapshot2之间变更的记录,将其合并到索引)
  9. 上一步更新索引结束后,等待事务2之前开启的持有snapshot的事务结束。
  10. 结束索引创建。索引可见。

Oracle 环境

使用online参数,CREATE INDEX ONLINEDROP INDEX ONLINE

create index  idx_table_name on table_name(col_name) online ;

MySQL 环境

5.6 开始支持在线DDL创建索引

在线DDL限制


标签:index,事务,name,tb1,create,DB,阻塞,索引
来源: https://www.cnblogs.com/binliubiao/p/14980369.html