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

news/2024/11/22 16:06:32/

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 可以查询无用的索引,通过查询获得自数据库运行后,从未使用过的索引。

SELECTpg_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.ppmy.cn/news/137154.html

相关文章

【Rust日报】2023-05-30 ratatui:tui-rs 的社区维护版本

ratatui:tui-rs 的社区维护版本 tui-rs 是一个广受欢迎的构建终端用户界面和仪表板的 rust 库,有很多有趣的项目 基于 tui-rs 进行开发。 其原维护者由于一些个人原因无法继续开发,因此,fdehau 基于 tui-rs 项目的一个积极维护的分…

Asp.net基于BS的计算机等级考试系统的设计与实现(源代码+论文)

随着计算机技术的发展及计算机的日益普及,基于B/S结构的考试系统与无纸化办公一样已成为大势所趋。论文详细论述了一个基于B/S结构的计算机等级考试系统的设计过程。软件采用ASP.NET 2005作开发平台,C#作编程语言,SQL Server 2005作数据库管理系统,实现了试题管理、试卷生成…

品牌如何给自己创建一个百度百科词条,在百科上传企业资料方法

对于企业来说,很多人都想给自己企业或者品牌上传正面简介内容到百度百科平台,但创建一个品牌百度百科词条似乎并不是那么简答,很多自己尝试创建品牌百度百科词条的朋友最终都失败了,下面洛希爱做百科网教教大家如何给自己品牌创建…

惠普笔记本触摸板无法使用的解决方案?

惠普笔记本触摸板左上角总是亮着黄灯,表示当前触摸板处于禁用状态; 取消禁用状态需要关闭黄灯,在触摸板左上角黄灯那个地方双击,黄灯变蓝色(或者黄灯关闭),这样就欧克了

惠普PAVILION Gaming NB 15-ak039TX触摸板关闭

1.下载 Synaptics 驱动 http://www.onlinedown.net/soft/226227.htm 2.安装上面驱动后(重启电脑),按下面流程禁用触摸板即可 https://support.hp.com/cn-zh/document/c05527889

暗影精灵5触摸板双指手势失效问题

触摸板的双指手势滑动突然失灵,不晓得怎么回事。可能是驱动问题。 https://h30318.www3.hp.com/pub/softpaq/sp93001-93500/sp93437.exe 我重新安装驱动之后就好了,但过一会又出现了问题,需要反复安装。 安装之后测试一下,如果…

设置笔记本的触摸板是否禁用

1. 在 我的电脑 --》 属性--》 控制面板 --》设备|硬件|鼠标 (最后都是找到鼠标这)——》 ----》硬件-----》属性----》驱动程序----》选择触摸板的启动程序-----》启|禁设备驱动

HP 惠普笔记本电脑 禁用触摸板 在插入鼠标后

我用的是hp 战66 笔记本,设置方法,要在电脑桌面上,右键点击,选择个性化,左边选择蓝牙和其它设备 - 触摸板 - 把连接鼠标时触摸板打开状态 前面的钩去掉