【postgresql初级使用】索引带来性能提升,它背后默默服务的维护者reindex功不可莫,并发维护与业务的取舍

重建索引reindex

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 重建索引reindex
  • 概述
  • 命令介绍
    • reindex工具
    • SQL命令语法
  • 案例分析
    • 查看索引大小
  • 总结
  • 结尾

概述


前面几章节有关索引的内容,介绍了索引的原理,根据索引算法不同列出了postgresql支持的五大索引类型,还有扩展索引类型;同时分几节介绍了创建不同用途的索引,如部分索引,唯一性索引,基于表达式的索引等等,满足不同场景需求。

之前这些内容,都是分享索引的用法,索引在使用的过程中,不同的插入,删除会使得索引存储变得越来越稀疏,在查询索引数据时,需要从磁盘读取的数据量越来越多,使得索引查询优势不再明显。

这就涉及到本节的内容-重建索引reindex,索性数据需要定期的进行维护,及时的消除索引数据的膨胀,使得索引查询效率能够保持。

命令介绍


索引如何来维护呢? 我们来看一下reindex命令的语法。

reindex工具

有两种途径来执行reindex命令,

  • 一种是通过工具来执行

在安装目录的bin目录下,会有名称为reindexdb的可执行工具,可以查看它的帮助进行操作。

[zpzhao@hatch bin]$ ./reindexdb --help
reindexdb reindexes a PostgreSQL database.Usage:reindexdb [OPTION]... [DBNAME]Options:-a, --all                    reindex all databases--concurrently           reindex concurrently-d, --dbname=DBNAME          database to reindex-e, --echo                   show the commands being sent to the server-i, --index=INDEX            recreate specific index(es) only-j, --jobs=NUM               use this many concurrent connections to reindex-q, --quiet                  don't write any messages-s, --system                 reindex system catalogs only-S, --schema=SCHEMA          reindex specific schema(s) only-t, --table=TABLE            reindex specific table(s) only--tablespace=TABLESPACE  tablespace where indexes are rebuilt-v, --verbose                write a lot of output-V, --version                output version information, then exit-?, --help                   show this help, then exitConnection options:-h, --host=HOSTNAME          database server host or socket directory-p, --port=PORT              database server port-U, --username=USERNAME      user name to connect as-w, --no-password            never prompt for password-W, --password               force password prompt--maintenance-db=DBNAME      alternate maintenance databaseRead the description of the SQL command REINDEX for details.Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>
  • 一种是通过SQL命令来执行

登陆客户端后,SQL命令中reindex可以进行重建索引。

下面重点介绍一下SQL命令的语法与使用方法,工具命令也同样有这些选择。

SQL命令语法

REINDEX [ ( option, ...) ] 
{ INDEX | TABLE | SCHEMA | DATABASE | SYSTEM }
name;

语法说明

  • option可选项,有三个选项供选择:
  • CONCURRENTLY , 有此选项时,采用并行重建的方式,具体后面介绍;
  • TABLESPACE new_tablespace,指定重建后的索引存储的表空间,如果不指定,则为当前表空间;
  • VERBOSE , 打印一些进度信息;
  • 指定索引的范围,可以选择如下内容之一:
  • index, 具体某一个索引,后面name 为索引的名称;
  • table, 重建指定表上的所有索引,name 为表名;
  • schema, 重建指定schema上的所有索引, name为对应的schema名称;
  • database, 重建指定database上的所有索引, name为指定的database, 如不指定name时,为当前登陆的database;
  • system, 重建系统表的索引,在指定database时,会跳过系统表的索引,此时可以不指定name。

案例分析


下面一起来看下如何维护索引,案例使用的表是products产品表,定义如下。

CREATE TABLE products (  product_id INT PRIMARY KEY,  product_name VARCHAR(255) NOT NULL,  price DECIMAL(10, 2) NOT NULL,  category VARCHAR(255)  
);  

除了主键索引外,为了方便观测,在product_name上新增了一个idx_proname的默认索引类型的索引。

查看索引大小

我们先来看一下索引数据的大小。

postgres=> create index idx_proname on products (product_name );
CREATE INDEX
postgres=> select pg_size_pretty(pg_total_relation_size('idx_proname')) ;pg_size_pretty
----------------3104 kB
(1 row)

这里使用postgresql 内置函数 pg_total_relation_size 来获取索引的数据大小;

pg_size_pretty函数,是把字节数转换为计量单位(KB,MB,GB等等)。

可以看到,初建之后,索引大小为3104KB, 下面我们模拟使用。

更新索引键的列,使得索引也会发生变化,让产品名后面再追加一个产品ID,生成新的产品名称。


postgres=> update products set product_name = product_name || product_id ;
UPDATE 100000

经过update操作,所有行都会被更新了一遍,理论上每条数据的索引都要新生成一次。

下面再来看索引数据的大小。

postgres=> select pg_size_pretty(pg_total_relation_size('idx_proname')) ;pg_size_pretty
----------------6184 kB
(1 row)

果然,索引数据翻了一倍还多一些。

为什么比一倍还多呢? 这里因为Btree索引算法,是一个树形结构,叶子节点才会存储真正的键值,那么随着叶子节点的增多,树的中间层节点也会增加,所以就会比实际数据多占一些空间。

经过长时间使用后,索引数据确实膨胀了不少,所以必须定期进行维护,下面看看维护后的效果。

postgres=> reindex index idx_proname ;
REINDEX

执行SQL语句 reindex ,指定维护的索引idx_proname, 很快就执行完成了。

然后再看一下索引数据的大小,是不是恢复了呢?

postgres=> select pg_size_pretty(pg_total_relation_size('idx_proname')) ;pg_size_pretty
----------------3104 kB
(1 row)

不出所料,数据行数没有发生变化,经过重建后,索引大小与新建时一模一样,太神奇了,又可以开心玩耍了。

总结


索引虽好,但不要贪哟,还需要时常维护的。 本文介绍了索引维护命令reindex, 它有两种命令形态,一是工具方式执行,另一种是SQL的方式。

通过一个案例,可以清晰的看到,经过一系列模拟使用后,索引数据明显发生了膨胀,势必造成索引的磁盘IO增加,影响索引的性能,经过reindex之后,又恢复了它初建的大小。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt窗口】—— 菜单栏

目录 &#xff08;一&#xff09;创建菜单栏 &#xff08;二&#xff09;在菜单栏中添加菜单 &#xff08;三&#xff09;创建菜单项 &#xff08;四&#xff09;在菜单项之间添加分割线 &#xff08;五&#xff09;综合示例 Qt 窗⼝是通过 QMainWindow类 来实现的。 QMa…

【NOIP2015普及组复赛】题3:求和

题3&#xff1a;求和 【题目描述】 一条狭长的纸带被均匀划分出了 n n n 个格子&#xff0c;格子编号从 1 1 1 到 n n n。每个格子上都染了一种颜色 c o l o r i color_i colori​ &#xff08;用 [ 1 &#xff0c; m ] [1&#xff0c;m] [1&#xff0c;m]当中的一个整数表…

超级好用的C++实用库之环形内存池

&#x1f4a1; 需要该C实用库源码的大佬们&#xff0c;可搜索微信公众号“希望睿智”。添加关注后&#xff0c;输入消息“超级好用的C实用库”&#xff0c;即可获得源码的下载链接。 概述 环形内存池是一种高效的内存管理技术&#xff0c;特别适合于高并发、实时性要求高的系统…

【内核】架构师的精神力量

不要被敌人的气势汹汹所吓倒 不要被尚能忍耐的困难所沮丧 不要被一时的挫折所灰心 道路是曲折的&#xff0c;前途是光明&#xff0c;黑暗即将过去&#xff0c;曙光就在眼前 有利的条件和主动的恢复&#xff0c;产生于再坚持一下的努力之中 以上来自毛选语录。 内心有了精神…

前端如何学会全栈分页开发?源码和思路都在这了

本项目代码已开源&#xff0c;具体见&#xff1a; 前端工程&#xff1a;vue3-ts-blog-frontend 后端工程&#xff1a;express-blog-backend 数据库初始化脚本&#xff1a;关注公众号程序员白彬&#xff0c;回复关键字“博客数据库脚本”&#xff0c;即可获取。 前言 这是博客系…

GMSL2硬件设计V1.1

一、说明 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司(现属于ADI)推出的一种高速串行接口,通过同轴电缆或屏蔽双绞线(STP)传输高速串行数据,用于汽车摄像头和显示器应用。GMSL2就是指ADI专有的第二代千兆多媒体串行链路技术,传输…

RPA+AI 应用案例集合:自动推流直播

使用场景&#xff1a; 自动定时推流直播 使用技术&#xff1a; python playwright 每个解决一个小问题 During handling of the above exception, another exception occurred:Traceback (most recent call last): File "D:\pythonTryEverything\putdonwphone\not_watch_…

前端开发工程师——webpack

一.环境准备 npm init -y npm i webpack webpack-cli -D 打包命令 npx webpack ./src/main.js --modedevelopment //development开发模式 //production生产模式 npx webpack 直接运行就行 二.加载器loader 在less/stylus/css/sass/images中添加适当的样式 例如&#xff1…

Python筑基之旅-文件(夹)操作和流

目录 一、文件操作 1、文件打开与关闭 2、文件读写 3、文件操作模式 4、文件编码 二、文件夹操作 1、创建文件夹 2、删除文件夹 3、改变当前工作目录 4、获取当前工作目录 5、检查文件/文件夹是否存在 6、遍历文件夹 三、文件路径操作 1、获取绝对路径 2、构建完…

爬山算法全解析:掌握优化技巧,攀登技术高峰!

一、引言 爬山算法是一种局部搜索算法&#xff0c;它基于当前解的邻域中进行搜索&#xff0c;通过比较当前解与邻域解的优劣来更新当前解&#xff0c;从而逐步逼近最优解。本文将对爬山算法进行详细的介绍。 二、爬山算法简介 爬山算法是一种基于贪心策略的优化算法&#xff…

11-异常-Exception

1. 异常示例 public static void main(String[] args) {int num1 10;int num2 0;int res num1 / num2;System.out.println("程序继续运行...."); } 数学上&#xff0c;做除法时&#xff0c;分母不能为0&#xff0c;运行到第三行就会出现错误&#xff0c;程序运行…

如何利用Ubuntu服务器运行深度学习项目?

一、整体思路 先配置好服务器端的软件环境&#xff08;工程源码&#xff0c;miniconda&#xff0c;cuda&#xff0c;显卡驱动等&#xff09;&#xff0c;然后用自己电脑的pycharm远程连接服务器运行代码。一句话总结&#xff1a;借用服务器资源运行代码&#xff0c;本地pycharm…

【推荐系统-特征工程】按每个日期生产特征的大忌

对于每个date&#xff0c;生产这个date前7天的某特征&#xff0c; inputDate 20240501 beginDate 20240501 - 7day SQL要用between这种逻辑 比如where dateColumn > beginDate and dateColumn < inputDate 而不是仅where dateColumn > beginDate。。。

ubuntu安装Stable Video Diffusion(SVD)让图片动起来

目录 写在前面 一、克隆或下载项目 二、下载预训练模型 三、创建环境 四、安装依赖 五、启动项目 六、解决报错 1.预训练模型下不来 2.TiffWriter.write() got an unexpected keyword argument fps 3.安装ffmpeg 4.No module named scripts 七、测试 写在前面 Stab…

深入解析内置模块OS:让你的Python代码更懂操作系统

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、OS模块简介与基础应用 二、文件与目录操作详解 三、OS模块的高级应用&#xff1a;双色…

第5章:软件工程基础知识

软件工程 软件工程过程是指为获得软件产品&#xff0c;在软件工具的支持下由软件工程师完成的一系列软件工程活动&#xff0c;包括以下4个方面。 (1)P(Plan)—软件规格说明。规定软件的功能及其运行时的限制。(2)**D(Do)**一软件开发。开发出满足规格说明的软件。(3)**C(Check…

力扣 90. 子集 II python AC

递归 class Solution:def __init__(self):self.nums Noneself.size Noneself.res []def dfs(self, ans, x0):if ans.copy() not in self.res:self.res.append(ans.copy())for i in range(x, self.size):ans.append(self.nums[i])self.dfs(ans, i 1)ans.pop()def subsetsWi…

web学习笔记(五十八)

目录 1. v-model 双向数据绑定 2. 事件修饰符 3. 路径别名 4. setup语法糖 4.1 语法糖的概念 4.2 setup语法糖 5. 配置代理服务器 1. v-model 双向数据绑定 v-model 双向数据绑定只能使用在表单标签&#xff1b; v-model双向数据绑定原理&#xff1a;采用 Object.de…

Go语言快速上手Zap日志库

1. Zap日志库简介 Zap是由Uber开源的Go语言日志库&#xff0c;以其高性能和易用性在Go社区中广受欢迎。它提供了丰富的日志记录功能&#xff0c;包括不同级别的日志记录、结构化日志输出、日志轮转等。对于Go语言开发者来说&#xff0c;Zap是一个非常好的选择&#xff0c;特别…