PostgreSQL-如何创建并发索引
索引简介
索引是数据库中一种快速查询数据的方法。索引中记录了表中的一列或多列值与其物理位置之间的对应关系,就好比一本书前面的目录,通过目录中页码就能快速定位到我们需要查询的内容。
建立索引的好处是加快对表中记录的查找或排序,但建索引需要付出以下代价:
- 增加了数据库的存储空间
- 在插入和修改数据时要花费较多的时间,因为索引也要随之更新
除了加快查询的作用外,索引还有一些其他的用途,如唯一索引还可以起到唯一约束的作用。
索引的分类
PG中支持以下几类索引:
- BTree:最常用的索引,BTree适用于处理等值查询和范围查询
- HASH:只能处理简单的等值查询
- GiST:不是单独一种索引类型,而是一种架构,可以在这种架构上实现很多不同的索引策略
- SP-GiST:“Space-Partitioned GiST”的缩写,即空间分区GiST索引。
- GIN:反转索引,可以处理包含多个健的值,如数组等,它支持用户定义的索引策略,可通过定义GIN索引的特定操作符类型实现不同的功能。PG的标准发布中包含了用于一维数组的GIN操作符类,比如,它支持包含操作符“@>”、被包含操作符“@<”、相等操作符“=”、重叠操作符“&&”等等
创建索引
CREATE [UNIQUE] INDEX [CONCURRENTLY] [name] ON table_name [USING method]
( { column_name | (expression)} [COLLATE collation] [opclass] [ASC | DESC] [ NULLS {FIRST | LAST}] [,...])
[WITH (storage_parameter = value [,...])]
[TABLESPACE tablespace_name]
[WHERE predicate]
一般,在创建索引的过程中会把表中的数据全部读一遍,该过程所用时间由表的大小决定,对于较大的表,可能会花费很久的时间。在创建索引的过程中,对表的查询可以正常运行,但对表的增、删、改等操作需要等索引建完后才能进行。对此PG提供了并发创建索引的方法。
假设由一张联系人的表,命令如下:
CREATE TABLE contacts(id int primary key,name varchar(40),phone varchar(32)[],address text
);
在该表中,由于一个人可能有多个电话号码,所以把“phone”定义为一个数组
为了实现按name快速查找,可以在字段name上建一个简单的BTree索引,命令如下:
CREATE INDEX idx_contacts_name on contacts(name);
如果像按电话号码phone字段快速查询,比如查询某个电话号码是谁的,由于此字段是一个数组,前面所建的BTree索引将不再起作用,这时可以建一个GIN索引,命令如下:
CREATE INDEX idx_contacts_phone on contacts using gin(phone);
如果想要查询号码“15873135680”是谁的,可以使用下面的查询语句:
SELECT * FROM contacts WHERE phone @> array['15873135680'::varchar(32)];
HASH索引的更新不会记录到WAL日志中,所以实际使用场景很少
创建索引可以指定存储参数“WITH(storage_paramter = value)”,常用的存储参数为FILLFACTOR,比如,可以这样创建索引:
CREATE INDEX idx_contacts_name on contacts(name) WITH (FILLFACTOR = 50);
也可以按降序创建索引:
CREATE INDEX idx_contacts_name on contacts(name desc);
如果字段name中有空值,则可以在创建索引时指定空值排在非空值前面:
CREATE INDEX idx_contacts_name on contacts(name desc NULLS FIRST);
也可以指定空值排在非空值后面:
CREATE INDEX idx_contacts_name on contacts(name desc NULLS LAST);
并发创建索引
通常情况下,在创建索引的时候PG会锁定表以防止写入,然后对表做全表扫描,从而完成创建索引的操作。在此过程中,其他用户仍然可以读取表,但是插入、更新、删除等操作将一直被阻塞,直到索引创建完毕。
如果这张表示更新较频繁且比较大的表,那么创建索引可能需要几十分钟,甚至数个小时,这段时间内都不能做任何插入、删除、更新操作,这在大多数的在线数据库中都是不可接受的。
所以,PG支持在长时间阻塞更新的情况下建索引,通过在CREATE INDEX中加CONCURRENTLY选项来实现。
该选项PG会执行表的两次扫描,因此会需要更长的时间来建索引,但是它还是很有用的。
并发创建索引测试

create table jxx_test(id int primary key,note text);insert into jxx_test select generate_series(1,5000000),generate_series(1,5000000);
同时开两个窗口,一个窗口执行创建索引,另一个窗口删除数据:


删除操作在创建完索引之后才会执行(图片上因为执行删除数据操作在创建索引发生之后才触发,有时间差)
继续同时开两个窗口,一个窗口执行创建索引(使用concurrently关键字),另一个窗口删除数:


创建索引时间虽然变长了,但是删除数据的操作不受阻塞,直接完成
并发重建索引
PG中,重建索引不支持CONCURRENTLY选项,但是PG中一个字段可以创建两个索引,所以并发重建索引可以执行以下步骤:
- 使用CONCURRENTLY选项建一个新的索引
- 删除旧索引
无效索引
创建索引过程需要注意,如果在创建索引过程中强行取消操作,会留下一个无效的索引:
- 仍然会导致更新速度变慢
- 如果是唯一索引,这个无效索引还会导致插入重复值失败

上述图片,可以通过shell窗口输入\d+table的命令查看。
需要手动删除该索引:
drop index idx_jxx_test_note;
修改索引
alter index idx_jxx_test_note rename to idx_jxx_test_note_new;

相关文章:
PostgreSQL-如何创建并发索引
索引简介 索引是数据库中一种快速查询数据的方法。索引中记录了表中的一列或多列值与其物理位置之间的对应关系,就好比一本书前面的目录,通过目录中页码就能快速定位到我们需要查询的内容。 建立索引的好处是加快对表中记录的查找或排序,但…...
【大数据模型】使用Claude浅试一下
汝之观览,吾之幸也!本文主要聊聊Claude使用的流程,在最后对国内外做了一个简单问题的对比,希望国内的大数据模型更快的发展。 一、产品介绍 claude官网 Claude是一款由前OpenAI的研究员和工程师开发的新型聊天机器人,…...
鼎盛合——国产电量计芯片的分类与发展
电池技术在 200 余年的时间里不断演进,并在近 30 年的时间里取得了飞速发展,从最早期的铜-锌电池、铅酸电池,到目前的锂电池、钠电池,电池能量密度从早期的~10Wh/kg 飞速攀升至 200Wh/kg。回顾历史上来看,电池管理系统…...
交叉验证之KFold和StratifiedKFold的使用(附案例实战)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
Cloud Kernel SIG月度动态:发布ANCK 5.10、4.19新版本,ABS新增仓库构建功能
Cloud Kernel SIG(Special Interest Group):支撑龙蜥内核版本的研发、发布和服务,提供生产可用的高性价比内核产品。 01 SIG 整体进展 发布 ANCK 5.10-014 版本。 发布 ANCK 4.19-027.2 版本。 ABS 平台新增 OOT 仓库临时构建功…...
JavaScript:new操作符
一、new操作符的作用 用于创建一个给定构造函数的实例对象 new操作符创建一个用户定义的对象类型的实例 或 具有构造函数的内置对象的实例。二、new一个构造函数的执行过程 2.1、创建一个空对象obj 2.2、将空对象的原型与构造函数的原型连接起来 2.3、将构造函数中的this绑定…...
XShell配置以及使用教程
目录 1、XShell介绍 2、安装XShell 1. 双击运行XShell安装文件,并点击“下一步” 2. 点击“我接受许可证协议中的条款”,点击“下一步” 3. 点击“浏览”更改默认安装路径,点击“下一步” 4. 直接点击“安装” 5. 安装完成࿰…...
Vue3 基础语法
文章目录 1.创建Vue项目1.1创建项目1.2 初始项目 2.vue3 语法2.1 复杂写法2.2 简易写法2.3 reactive(对象类型)2.4 ref(简单类型)2.5 computed(计算属性)2.6 watch(监听) 3.vue3 生命周期4.vue3 组件通信4.…...
【开源项目】Disruptor框架介绍及快速入门
Disruptor框架简介 Disruptor框架内部核心的数据结构是Ring Buffer,Ring Buffer是一个环形的数组,Disruptor框架以Ring Buffer为核心实现了异步事件处理的高性能架构;JDK的BlockingQueue相信大家都用过,其是一个阻塞队列…...
双向链表实现约瑟夫问题
title: 双向链表实现约瑟夫问题 date: 2023-05-16 11:42:26 tags: **问题:**知n个人围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去&…...
日心说为人类正确认识宇宙打下了基础(善用工具的重要性)
文章目录 引言I 伽利略1.1 借助天文望远镜获得了比别人更多的信息。1.2 确定了科学研究方法:实验和观测 II 开普勒三定律 引言 享有科学史上崇高地位的人,都需要在构建科学体系上有重大贡献。 日心说在哥白尼那里还是一个假说,伽利略拿事实…...
Kali-linux系统指纹识别
现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录。指纹识别是识别系统的一个典型模式,包括指纹图像获取、处理、特征提取和对等模块。如果要做渗透测试,需要了解要渗透测试的操作系统的类型才可以。本节将介绍使用Nmap工具测试正在运行的主…...
Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展
营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标…...
Java字符串知多少:String、StringBuffer、StringBuilder
一、String 1、简介 String 是 Java 中使用得最频繁的一个类了,不管是作为开发者的业务使用,还是一些系统级别的字符使用, String 都发挥着重要的作用。String 是不可变的、final的,不能被继承,且 Java 在运行时也保…...
中国20强(上市)游戏公司2022年财报分析:营收结构优化,市场竞争进入白热化
易观:受全球经济增速下行的消极影响,2022年国内外游戏市场规模普遍下滑。但中国游戏公司凭借处于全球领先水平的研发、发行和运营的能力与经验,继续加大海外市场布局,推动高质量发展迈上新台阶。 风险提示:本文内容仅代…...
如何自学C++编程语言,聊聊C++的特点,别轻易踩坑
为什么现在有那么多C培训班呢?因为这些培训班可以为学生安排工作,而外包公司因为缺人,需要做很多项目,可能需要在全国各地分配不同的程序员去干不同的项目,因此需要大量的程序员入职。这样,外包公司就会找培…...
算法Day07 | 454.四数相加II,383. 赎金信,15. 三数之和, 18. 四数之和
Day07 454.四数相加II383. 赎金信15. 三数之和18. 四数之和 454.四数相加II 题目链接:454.四数相加II 寻找两个数组之和,是否与另外两个数组之和有特定的关系。 因为数值可能跨度太大,选择使用下标表示为对应的数值大小,会很浪费…...
ps抠图、抠头发去背景等
方法一:背景橡皮擦 一、很早之前我们使用的是魔术棒工具,但现在我们可以使用Photoshop 有内置的“背景橡皮擦” 步骤: 第1步:在Photoshop中打开需要修的图。 第2步:单击并按住工具栏…...
计算机组成原理基础练习题第一章
有些计算机将一部分软件永恒地存于只读存储器中,称之为() A.硬件 B.软件C.固件 D.辅助存储器输入、输出装置以及外界的辅助存储器称为() A.操作系统 B.存储器 C.主机 D.外围设备完整的计算机系…...
[PyTorch][chapter 34][池化层与采样]
前言: 这里主要讲解一下卷积神经网络中的池化层与采样 目录 DownSampleMax poolingavg poolingupsampleReLu 1: DownSample 下采样,间隔一定行或者列进行采样,达到降维效果 早期LeNet-5 就采样该采样方式。 LeNet-5 2 Max pooling 最大值采样…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
Centos 7 服务器部署多网站
一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...
