PostgreSQL 对特定类索引的优化,节省磁盘空间百倍 --BRIN 索引应用在生产案例...

news2024/11/20 14:35:03

6dfff40fd07f0c20c4c6229d5e53ea63.png


开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共830人左右 1 + 2 + 3)新人会进入3群。

在使用POSTGRESQL数据库的时候,我们经常发现一些常见的问题

1  PG的磁盘消耗,相对于其他的数据库可能会稍快,尤其是进行DML操作中UPDATE 操作居多的情况下。

2    PG 的索引越多,相对于进行VACUUM ,AUTOVACUUM的时间就越长。

3    时间索引使用BTREE 占用的空间较大。导致表体积臃肿,数据处理的效率变慢。

基于提高PG使用的效率,降本增效的理念,针对一些时间字段是否有必要使用BTREE 索引,我们需要来一场比较和争论。在争论的开始,我们需要来进行一个数据的支持,也就是 talk is cheap , show me the code.

方案中的明星,BRIN 索引,BRIN 索引本身是针对并不是对于数据的物理的存储位置有一个明确的定位,BRIN 索引相当于一个汇总,根据存储值的范围来将这些数据相邻的 BLOCK 分成一组,计算取值范围,通过便利组来获取数据具体在哪个范围的BLOCK组中,基于这样的原理,BRIN索引适合顺序型,日期型,的数据查找,而非常不适合随机数据和采用率大的数值的索引替代的方案。

0dfe735a6d9f77768e9efbdcd3cf3fe4.png

1e93ebfe0eb683157474fc7ba2250a15.png

其中我们最大利用它的优势就是BRIN索引的空间占用会极小,多个相邻的BRIN 索引才会产生一条索引记录,同时BRIN 索引也不适合数据被经常删除的业务环境,所以使用BRIN 索引的前提总结

1  必须是有序的数据类型
2  数据行不会被经常频繁的删除
3  索引在实际业务体系中,并不承担核心的索引的功能

经过总结,BRIN 在我们日常的数据库系统中,特别适合时间类型的数据索引的形成,同时针对日志类型的表,中的数据字段,是非常适合进行BRIN索引的使用。

那么我们废话少说,我们针对一些索引来做一些测试。

18dd98fa0c3744f3f03ae3621acda7a8.png

编号表名索引名BTREE 索引大小索引名BRIN索引大小BTREE 查询时间字段数据时间BRIN 索引查询时间字段数据时间节省磁盘空间节省百分比
 1biz_ssidx_d1_biz_ss45MBidx_biz_ss_brin168kb    160.786 ms5.05ms44.83MB99.6%
2biz_ssidx_d1_biz_ss45MBidx_biz_ss_brin320kb    80.786 ms3.258ms44.68MB99.2%
3biz_ssidx_d1_biz_ss45MBidx_biz_ss_brin372kb    40.786 ms3.72ms44.628MB99.1%
4biz_scidx_sc-1_d1278MBidx_biz_sc_brin4352kb  4699ms222ms273.648 MB98%
5biz_scidx_sc-1_d1278MBidx_biz_sc_brin2184kb  8669ms117ms275.816 MB99.2%
6biz_scidx_sc-1_d1278MBidx_biz_sc_brin1096kb   16669ms116ms266.904 MB99.6%


在测试中我们针对这个两个表中的日期类型的数据,的两种索引进行了的比对,BTREE 和  BRIN 索引,二者在查询的时间上的区别会随着你的数据的随机性而产生变化,如果是纯顺序型的数据,则BRIN 索引不光小,同时查询的时间并未比BTREE 要满,甚至还会快于BTREE 索引,但从体积上来说,性价比极高。

同时需要注意的

1 数据的插入与索引的更新,这数据在插入到数据库表中,并不是马上会触发索引的更新,而是要看情况。
1.1  索引使用的range map page 被写满了,那么将触发更新索引的工作
1.2  autovacuum 工作中,会触发BRIN索引的更新
1.3  vacuum 工作时会触发BRIN 索引的更新

而再次重申 BRIN索引在PG数据库中,是最不喜欢,DELETE和 UPDATE操作,因为这样的操作会导致,BRIN索引中的最大和最小值的范围的计算重新开始,将会导致需要扫描整个的 REANGE BLOCK,在计算出新的BRIN索引的每个BLOCK中的范围。

基于这个问题,这就导出另一个问题,我们的BRIN 索引的 桶 姑且称为桶中存放的数据,是多还是少的问题。举例 我们建立一个BRIN 索引。

CREATE INDEX index_name ON tablename USING BRIN (create_time) WITH (pages_per_range = 16,autosummarize = on);

这里着重说一下,两个建立索引的参数
pages_per_range ,这里如果你不写这个参数则默认值为 128, 随着数值的减小,你的桶总存放的数据量就变小,相关的整体的索引就会变大,在我们简单的测试中,我们针对几个值进行了测试  16  8  4  ,上面两个表中,分表都针对这三个值进行了POC ,则最终我们发现 8 这个数值在数据查询效率和索引的大小上,都是一个比较良好的选择。

当然由于基本的数据采样少,也就导致这个结果并不具有一定的普及型,所以具体这个值应该是什么,还是要进行自己实体系统的测试,找到适合的值。另外 autosummarize 默认是关闭,如果是开启的状态,则当检测到下一个页面有数据插入,则对上一个页面的范围进行重新的计算。

最终我们使用了这个方案,其中需要界定的

1  索引本身不是业务类的索引

2  索引本身使用的频率不高

3  纯时间类的索引,顺序性,并且表中的数据不是经常更新的类型

实际在更大容量的表与索引的测试中,如较大的时间类型的索引 22G --23G 可以在使用BRIN 索引后,减小到 47MB --235MB ,具体可以收缩后的大小与你选择的 pages_per_range 的数字大小有关,数字越小则产生的BRIN 索引越大,但是这里不是说我的数字越小我的索引的能力越强,在测试中,我们发现 22G 的索引大小在使用 page_per_range的情况下数字在 32  -64 的性能是较好的,而当数字下降到 8 后性能开始降低,同时也发现在使用BRIN 索引中,如果你的数据查询的位置在靠近整体数据集合的尾部,则查询的速度要快于顺序条件在前部的部分,当然由于测试的用例不多,这里仅仅是反映一个情况。

最终我们的一个索引由22G 变为  47MB ,节省了大量的磁盘空间。

小结:写到最后,POSTGRESQL 中的索引在所有目前的传统数据库中,提供了丰富的选择,对于不同的PG提供类型的索引的定位和切实的使用是一个我们应该进行的工作。

09aa606cf92885afa990b65977650e8b.png

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

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

相关文章

为生信写的Python简明教程 | 视频5

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

Pytorch教程:Autograd基础

PyTorch的Autograd特征可以让PyTorch灵活快速的构建机器学习项目。autograd可以实现快速和容易的多重偏微分(梯度)计算。偏微分计算时反向传播神经网络学习的核心。 autograd的可以在运行时动态追踪计算,这意味着如果模型有决策分支、或者有…

linux 系统服务管理

目录 一、chkconfig 1、列出服务列表 chkconfig --list 2、关闭开启服务 chkconfig 服务名 on/off 3、添加新服务 chkconfig --add 服务文件名 4、删除已有服务 chkconfig --del 服务名 5、系统级别定义: 一、chkconfig chkconfig——centos…

Python学习46:分配学号(python123)

类型:列表元组‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬…

【Java项目】多种方式解决SpringBoot中遇到的控制台中文乱码问题

文章目录 配置JVM参数配置maven参数配置Runner配置Encoding通过配置文件 配置JVM参数 -Dfile.encodingUTF-8配置maven参数 重点就是 <configuration><fork>true</fork><jvmArguments>-Dfile.encodingUTF-8</jvmArguments></configuration>…

Linux常用命令——git命令

在线Linux命令查询工具 git 是目前世界上最先进的分布式版本控制系统 补充说明 git命令很多人都知道&#xff0c;Linus在1991年创建了开源的Linux&#xff0c;从此&#xff0c;Linux系统不断发展&#xff0c;已经成为最大的服务器系统软件了。 Linus虽然创建了Linux&#x…

线程池最佳实践

文章目录 yml参数配置定义参数实体bean配置线程池实战线程池高级理论线程池工作流程概述线程池拒绝策略线程池参数设置原则1&#xff09;如何为线程池设置合适的线程参数&#xff1f;2) 如何获取当前服务器的cpu核数&#xff1f;3) 无界队列问题 yml参数配置 # 定时任务线程池…

Spring高手之路1——深入理解与实现IOC依赖查找与依赖注入

本文从xml开始讲解&#xff0c;注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例2. IOC 的两种实现方式2.1 依赖查找&#xff08;Dependency Lookup&#xff09;2.2 依赖注入&#xff08;Dependency Injection&#xff09; 3. 在三层架构中的 service 层与 dao 层体会依…

Kafka与消息队列的比较

消息队列&#xff08;Message Queues&#xff09;是一种允许分布式系统和应用异步通信的服务。异步通信意味着消息发送者在等待接收者接收消息之前不需要等待&#xff0c;这可以提高性能和可扩展性&#xff0c;使应用能够并行处理消息。消息队列通过将消息存储在队列中来工作。…

【Vue_项目搭建部署】VUE快速入门——部署_安装ele等

检查是否安装 node npm npm -v node -v 全局安装yarn npm install -g yarn 安装完后&#xff0c;可以配置yarn的淘宝镜像 yarn config get registry //查看当前配置的镜像源 //https://registry.yarnpkg.com yarn config set registry http://registry.npm.taobao.or…

【Redis29】Redis进阶:缓存穿透、击穿与雪崩

Redis进阶&#xff1a;缓存穿透、击穿与雪崩 其实啊&#xff0c;这个内容本来不打算写了&#xff0c;网上讲这一块的内容实在是太多了。不过呢&#xff0c;本着学习还是要全面的原则&#xff0c;而且还要让自己多多巩固复习的原则&#xff0c;咱还是来写一道吧。 同样的&#x…

把钢铁侠战衣交给Z世代,没想到联想商用PC可以这么炫酷!

在数字化转型成为全球政企战略性与常态化诉求的今天&#xff0c;没有人会怀疑新一代数字技术和工具的重要性。 千行百业需要拥有全新的工具握力&#xff0c;也带动了商用 PC的市场需求不断被激发&#xff0c;产品升级迭代速度加快&#xff0c;成为PC行业最具发展机遇的市场。 从…

【Python】Python进阶系列教程--Python AI 绘画(二十)

文章目录 前言Windows 环境安装Civitai 介绍 前言 往期回顾&#xff1a; Python进阶系列教程-- Python3 正则表达式&#xff08;一&#xff09;Python进阶系列教程-- Python3 CGI编程&#xff08;二&#xff09;Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动&a…

好几位朋友最近被迫创业!

见字如面&#xff0c;我是军哥&#xff01; 最近好几位朋友被迫创业&#xff0c;有程序员也有之前做业务的朋友&#xff0c;问其原因&#xff0c;都说现在找工作比较难&#xff0c;想想还是自己干吧。 对于这样的回答&#xff0c; 我表示非常的担心&#xff0c;因为风险实在是太…

VMIX如何RTMP推流给灵派编码器

本文链接&#xff1a;https://blog.csdn.net/weixin_45326556/article/details/131181058 第三方设备&#xff08;例如vMix&#xff0c;OBS&#xff09;如何RTMP推流给灵派编码器 1. 灵派编码器内置RTMP-SERVER2. 其他设备RTMP推流给灵派编码器方法3. 如何使用第三方推上来的RT…

Linux---ln命令、date命令

1. 链接命令ln ln&#xff08;link files&#xff09;命令的功能是为某一个文件在另外一个位置建立一个同步的链接。 当需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;不需要在每一个目录下都放一个相同的文件&#xff0c;只需要在 某个固定目录&#xff0c;放上…

以正式员工身份从京东出来,又通过外包回去了,不甘心啊!

人生是一个圈&#xff0c;职场也是一个圈&#xff0c;一位京东员工就以实际行动诠释了这个“圈”&#xff1a; 以正式员工身份从京东出来&#xff0c;又通过外包回去了&#xff0c;不甘心啊&#xff0c;但外面找工作是地狱级难度&#xff01; 网友纷纷表示“笑死”、“有被笑到…

基于最小费用流(MCF)法的相位解包裹理论与实验验证-含Matlab代码

一、引言 最小费用流算法(Minimum cost flow, MCF) 最早是由 Costantini M. A1998 年提出的&#xff0c;该方法是将未解缠相位的相邻梯度差与解缠相位的相邻梯度差间的差异即不连续性最小化&#xff0c;具有极强鲁棒性与准确性&#xff0c;有基于规则与不规则网络之分。2002年…

Python实现ACO蚁群优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

Flutter的Stack和Positioned的控件

简介 Flutter中的Stack控件是一种可用于将多个子控件重叠在一起的布局控件。Stack将所有子控件放在同一个位置&#xff0c;它们可以根据需要进行定位、缩放或旋转。Stack中的子控件可以是任何类型的控件&#xff0c;例如文本、图像、按钮等。 主要属性 Stack控件的主要属性包…