PostgreSQL 如何在线创建索引?

数据库关系型数据库技术服务知识库
问题描述

数据库创建索引可能会锁住创建索引的表,这样阻塞业务在生产中一般是不被允许的,那么 PostgreSQL 如何解决这个问题哪?

问题分析

PostgreSQL 在 CREATE INDEX 命令中新增CONCURRENTLY 选项来实现索引的并发创建

验证方法
  1. 创建测试表并插 3000000 条 数据
postgres=# CREATE TABLE demo(id int);
CREATE TABLE
postgres=# INSERT INTO demo SELECT generate_series(1,3000000);
INSERT 0 3000000
  1. 同时打开两个 Session, 其中一个 Session 创建索引,另外一个 Session , 另外一个 Session 执行 DML 语句观察是否会阻塞
会话1 执行 CREATE INDEX 操作
postgres=# CREATE INDEX demo_id_index1 on demo(id);
CREATE INDEX

会话2 执行DELTE 操作

postgres=# delete from demo where id=13;
DELETE 2
Time: 1684.813 ms (00:01.685)

观察发现会话2在删除数据是会被阻塞,需要等待 CREATE INDEX 操作完成后才会删除,耗时1684.813 ms

  1. 加上 CONCURRENTLY 选项,我们执行相同的操作步骤
会话1 执行 CREATE INDEX 操作
postgres=# CREATE INDEX CONCURRENTLY demo_id_index5 on demo(id);
CREATE INDEX

会话2 执行DELTE 操作
postgres=# delete from demo where id=15;
DELETE 2
Time: 22.956 ms

观察会发现 DELETE 操作会很快地被执行

参考文档

https://www.postgresql.org/docs/12/sql-createindex.html 如果您有其他问题,欢迎您联系火山引擎技术支持服务

28
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论