POSTGRESQL 索引添加不合理有什么负面影响

news2024/11/25 20:43:59

c8958c827019befa72f553f0499be22a.png

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

数据库中使用索引进行查询语句或DML 操作的优化是一个通常的手段,通过添加索引可以加快这些操作的速度。通常在没有DBA 的场景下,开发人员对于索引的添加可能会造成一些负面的影响,这是值得注意的。下面来讲讲在POSTGRESQL 中索引添加和使用中的一些负面的影响。

过度的使用索引会造成什么问题,对数据库系统有什么负面影响,我们将从以下的几个方面来进行阐述。

一、  索引添加后,表操作中的DML操作成本提高降低表在数据吞吐的速度

这个问题在很多数据库中都会存在这个问题,添加的索引过多,导致数据表操作时DML操作异常的缓慢,首先表和索引之间是一个原子操作的关系,对每个行操作所对应的索引都需要进行数据的插入和更新。

在POSTGRESQL 中对比其他的数据库产品还会有一个特性必须被谈起,hot update, 这本来是POSTGRESQL 通过自身独有的MVCC 的方式来对于索引数据在UPDATE 后,进行更新的一种方式,初衷是避免更新行数据时阻塞其他的事务,但这样的操作有利有弊,对于以下的一些操作我们需要注意:

1  频繁的更新的业务,尤其对于数据库行快速的更新,这就导致POSTGRESQL 需要频繁的更新行数据和相关的索引,这样操作会导致更多的HOT UPDATE 的操作

2  OLAP 或类操作在访问被更新的索引的情况下,会导致查询的性能有一定的下降,在访问时需要等待更新索引的操作 完成。

3 更大量的数据插入,UPDATE 以及数据高频的查询,这三者混合起来会造成HOT UPDATE 的工作有延后的情况,这样会导致性能进一步的下降。

二、太多的索引与更新操作产生也分割的问题

这个问题实际上在其他的数据库也是存在的,基于POSTGRESQL MVCC的原理,当一个更新的操作导致他所在的页面无法承载更新后的数据后,那么POSTGRESQL 会产生分割页面的方式,将数据页写入新的页面,而页面的分割操作会产生一定的性能影响,对于IO

三、更多的索引会导致索引利用率降低,需要更多的内存缓冲的问题

在索引的使用中,索引必然是加载到内存中的,而一些非标准的索引,尤其是本来一个索引 包含2个字段可以解决的问题,而由于人为的原因,这个索引本身通过更多的字段来进行建立,这些无用的字段会同时加载到POSTGRESQL的内存中,降低数据库缓冲的利用率,同时基于这些冗余的字段在索引中,导致需要更多的内存来保存这些索引的数据库,变相提高了索引使用的成本。

四、太多的索引导致消耗更多的存储和IOPS

索引建立的过多,或单个索引中无用的字段过多,这些数据都是需要进行存储的,我们经常在分析索引的时候发现有的索引可能是这个表本身一般的容量,或更多,而有的表本身可能50个G,但这个 表上的索引们占用了300个G,这样的情况在有些项目是非常常见的,除了对于存储的消耗,另外一个部分就是这些操作中,索引太多导致IOPS 的提高,更多的索引会也会导致 vacuum 的成本增高,其中vacuum 执行中,耗时较多的是在索引的操作,对于数据表本身的操作并不十分耗时。

五、更多的索引导致WAL 日志产生的成本增高

基于POSTGRESQL WAL 产生的原理对于INDEX 在wal中也会产生基于索引的WAL记录,这个设计对于数据库崩溃后的恢复有相关的作用。但更多的索引导致产生WAL 的性能消耗较大成功更高。

六、更多的索引导致vacuum 和 autovacuum 的性能消耗更大

在前面我们提到了更新后导致的页分割等问题,同时基于POSTGRESQL的MVCC 原理,在数据更新和删除操作后,会有基于回收的vacuum 和 autovacuum 的操作,索引也是需要进行相关的回收操作,以及索引与数据之间重新指向的问题。更多的索引导致,vacuum 和 autovacuum操作复杂度提高,操作的时间加长,同时IOPS 在操作时会产生更大的压力。

怎么产生索引的问题,这也是我们需要思考的问题,一般产生不适宜的索引的问题,主要的根本原因是建立索引时,只是针对某个SQL进行的索引添加,而随着语句的增加,这样的点状的工作模式不能适应复杂的SQL,更多有组织的全局性的工作方法更有助于减少上述问题。

下面的SQL 可以查询无用的索引,通过查询获得自数据库运行后,从未使用过的索引。

SELECT
    pg_stat_user_indexes.indexrelid::regclass AS index_name,
    pg_class_relname(pg_stat_user_indexes.indexrelid) AS table_name,
    pg_size_pretty(pg_relation_size(pg_stat_user_indexes.indexrelid)) AS index_size,
    idx_scan AS number_of_scans,
    idx_tup_read AS rows_read,
    idx_tup_fetch AS rows_fetched,
    indisvalid AS is_valid,
    indexdef
FROM pg_stat_user_indexes
JOIN pg_index ON pg_index.indexrelid = pg_stat_user_indexes.indexrelid
WHERE NOT idx_scan > 0

AND pg_index.indisunique IS false;

9a59a46d93bde81d8354800257b3797a.png

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

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

相关文章

软考A计划-试题模拟含答案解析-卷十六

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

基于SpringBoot和vue的若依后台管理系统 部署

RuoYi-Vue是一款前后端分离的极速后台开发框架,基于SpringBoot和Vue。 目录 一、准备 二、启动前端项目 解决报错:digital envelope routines::unsupported 【测试】 三、启动后端项目 四、运行数据库sql文件建表 五、开启redis缓存服务 【redis…

基于html+css的图展示103

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

java 利用poi根据excel模板导出数据(一)

前言 作为B端开发,导出数据是不可以避免的,但是有时候需求很变态,表头复杂的一笔,各种合并单元格,如下图: 这些虽说用代码可以实现,但是很繁琐,而且代码并不能通用,遇到…

哈工大华为提出ControlVideo:一种无需训练的可控视频生成方法

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>【扩散模型和Transformer】交流群 导读 哈工大&华为云最新提出了一种可控的文本-视频生成方法ControlVideo,在无需训练的条件下,仅使用一张2080Ti…

长沙之行第二天

这是学习笔记的第 2458篇文章 已经从长沙返京一个多星期了,旅行日记还没有写好,真是羞愧,赶紧补一补回忆。 整体来看返京后这一周我最大的变化就是几乎每天都订1次外卖吃长沙牛肉粉。 第二天 自第一天逛完橘子洲之后,我们的行程重…

3.11 Ext JS文件上传基本使用

文件上传对应的组件是Ext.form.field.File。 组件的效果是输入框+文件选择按钮,如下图所示: 点击“选择文件的按钮”, 会弹出操作系统选择文件的对话框,如下图所示窗口: 选择文件后,输入框会根据不同的浏览器有不同的显示, 有的浏览器是文件名,有的浏览器是完整路径,…

c#特性Attribute

C# 特性(Attribute) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在…

分享几款还不错的工具,这几个工具你们知道吗?

1、可口的披萨 这是一款非常有趣的小游戏,它不仅可以帮助你超解压,还能消磨时间。你将扮演一位店主,经营一家小店。在这个过程中,你会遇到各种不同的人,每个人都有着自己的故事和背景。这些故事非常感人,会…

scitb5函数1.6版本(交互效应函数P for interaction)尝鲜版发布----用于一键生成交互效应表

在SCI文章中,交互效应表格(通常是表五)几乎是高分SCI必有。因为增加了亚组人群分析,增加了文章的可信度,能为文章锦上添花,增加文章的信服力,还能进行数据挖掘。 在上一个版本中,我们…

使用PlotNeuralNet绘制深度学习网络图的基本操作

使用PlotNeuralNet绘制深度学习网络图的基本操作 PlotNeuralNet工具,具如其名,plot neural net用的,首先我们看看效果: PlotNeuralNet安装与简单命令了解 关于如何安装大家可以参考网上的其他教程,网上有很多教程&…

如何使用ArcGIS查找离家最近的地铁站(附练习数据)

学习GIS的目的除了可以用在工作上之外,还可以用在平时的生活中,比如可以用来查找定位离家最近的地铁站,这里给大家介绍一下查找方法,希望能够对大家有所帮助。 近邻分析 在ArcToolbox中点击“分析工具\邻域分析\近邻分析”&#…

数据体系建设-ODS|DW|TDM|ADS介绍

参考书目《数据中台:让数据用起来》 ODS:各业务生成的基础数据存表,如log日志数据等DW:在ods基础上,分主题整合数据TDM:存储标签数据ADS:基于上面的数据源整合而成的供业务应用的指标报表等 贴…

什么是EDI 858装运信息?

EDI 858是电子数据交换(Electronic Data Interchange,简称EDI)中的一种标准格式,它主要用于在供应链管理中进行物流和运输的数据交换。EDI 858是指基于ASC X12标准的858交付和接收数据集,也被称为”Shipping Notice/Ma…

基于Spring boot的图书商城管理系统-源码、数据库、LW

框架:Springboot 数据库:MySQL 下载链接: https://download.csdn.net/download/yw1990128/87851197 B站运行链接: 基于Springboot的图书商城管理系统_哔哩哔哩_bilibili 引言 项目开发背景 Internet最早在美国出现&#xf…

GLSurfaceView 与 SurfaceView 联系与区别

同系列文章: SurfaceView为什么不能做动画? SurfaceViewMediaPlayer实现视频播放 本文目录 笔试题解析有了SurfaceView,为什么还要提供一个GLSurfaceView?SurfaceView有哪些用途? 笔试题解析 下面是属于GLSurfaceView特性的是&a…

Android开机流程、Zygote进程、systemserver、ServiceManager

一、Loader层 1、Boot ROM: 上电后,BootRom会被激活,引导芯片代码开始从预定义的地方(固化在ROM)开始执行,然后加载引导程序到RAM。 2、 Boot Loader引导程序 Android是基于Linux系统的,它没有BI…

Arcgis进阶篇(6)——如何将Arcgis Pro的离线数据发布成服务

常常因为Arcgis Server(或者GeoScene Server)昂贵的价格,而导致小项目技术选型选择开源的GIS Server(如GeoServer等)。但用完之后,发现后者实在拉跨,使用对比差异巨大。那就只能另想办法&#x…

商家618活动文案怎么写,注意事项

马上又是一年的618,特别是最近大家消费热情高涨的时候。今天,就来和大家好好唠一唠618。商家618活动文案怎么写,以及注意事项。 为了以防有些人没有真正了解618,虽然可能性很小,但是本着严谨的原则,还是先介…

MySQL数据库 3.内部数据模型

🤔前言: 🙂关系型数据库: 关系型数据库是建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 关系型数据库是一种使用关系模型来组织数据的数据库系统。数据以二维表的形式存储,一张表代表一种数…