PostgreSQL中创建索引的消极影响

news2024/11/24 18:54:07

相信大家在使用数据库中,提高SQL查询速度最简单的办法就是添加相关索引,但是其实我们创建的索引并不一定能用上,有时候顺序扫描也并不见的就比离散的索引扫描差,任何事物我们要辩证的看待,今天我们说明一下创建索引的一些消极影响,可以在生产使用环境中权衡利弊,再决定是否有必要使用索引。

首先可以参考一下索引无法使用的情况,参考https://mp.weixin.qq.com/s/9JZpGRJ_TfovqvA-kJR3CA
在这里插入图片描述
详情可以阅读以上链接,这里不再举例一一说明。

下面介绍一下创建索引的消极影响

  1. DML导致写放大
    如果一张表的索引比较多,DML可能会导致写放大,添加索引后,我们可能会看到SELECT语句的性能有所提高。从概念上讲,表上的每个DML语句都需要更新表的所有索引。尽管有很多优化可以减少写放大,但仍然是一个相当大的开销。

  2. 内存使用的增加,索引需要更多的缓存
    要使用的索引页必须在内存中,无论是否有查询使用它们,因为它们需要通过事务进行更新。这样就导致表页可用的内存变得更少了。索引越多,有效缓存所需的内存就越多。由于随机的写入和读取索引,索引需要在缓存中存储更多的页面。索引的缓存需求通常比关联的表高很多。如果我们不增加可用内存,就可能会影响系统的整体性能。

  3. 随机写I/O
    与行插入操作不同,行更新不太可能被插入到同一页中。众所周知,像B-Tree索引这样的索引会导致更多的随机写入。

  4. WAL日志的增加
    除了更新表的WAL记录外,还会有索引的WAL记录。这有助于崩溃恢复和复制。可以使用pg_gather插件进行观察,可以清楚地看到生成WAL的开销。实际影响取决于索引类型。

  5. 更多的I/O
    不仅仅是WAL记录的生成会占用I/O;我们也会有更多的页面被弄脏。当索引页弄脏时,必须将它们写回到文件,从而导致更多的I/O,比如会有“DataFileWrite”等待事件。
    另一个副作用是索引增加了活动数据集的总大小。这里活动数据集,指的是经常查询和使用的表和索引。随着活动数据集大小的增加,缓存变得越来越低效。低效的缓存会导致更多的物理数据文件读取,因此读I/O增加。这些增加的读I/O就是从物理存储中读取索引页面的I/O。也可以通过pg_gather查看具体信息。

  6. VACUUM/AUTOVACUUM的影响
    正如前面所说,不仅仅增加了插入或更新索引页的开销,由于索引还需要清理旧的元组引用,因此维护它有开销。
    在现实情况中,我经常看到这样的情况,由于表比较大,而且表上的索引数量也比较多,单个表上的autovacuum运行了很长时间。实际中,用户也看到他们的autovacuum“卡住”了几个小时,没有进展,并持续很长时间。这是因为autovacuum的索引清理阶段是不透明的,在pg_stat_progress_vacuum等视图中是不可见的。
    随着时间的推移,索引会变得膨胀,效率会降低。在许多数据库系统中可能需要定期索引维护(重建索引:REINDEX)。

  7. 更多的存储需求
    索引越多,当然我们使用的存储空间越多,因此,备份也会占用更多的时间、存储和网络资源,而且同样的备份会给主机带来更多的负载。这还会增加恢复备份和恢复备份的时间。越大的数据库会影响很多事情,比如花更多的时间来构建备用实例。

  8. 索引导致的BUG
    随着索引越来越多,可能导致的BUG也会越来越多,比如PG14中的静默索引损坏

那我们到底该如何做呢?

在考虑新建索引时,应该考虑一系列关键问题:是否必须有这个索引,或者是否有必要以增加索引为代价来加快查询速度?是否有一种方法可以重写查询以获得更好的性能? 放弃索引带来的小收益,不使用索引会怎么样?
现有的索引也需要定期进行严格的审查。应该考虑删除所有未使用的索引(那些在pg_stat_user_indexes中idx_scan为零的索引)。像pgexperts这样的脚本可以帮助进行分析。

今年即将发布的PostgreSQL 16在pg_stat_user_indexes / pg_stat_all_indexes中增加了一个列,名为last_idx_scan,它可以告诉我们最后一次使用索引是什么时候(时间戳)。这将帮助我们全面了解系统中的所有索引。

总结:

简单来说就是:索引是有代价的,而且代价可能是多方面的。索引并不总是合适的,顺序扫描也不总是坏的。调优策略一般是自顶而下的,可以从主机硬件、操作系统、PostgreSQL参数等开始调优,从而获得更好的结果。在创建索引之前,进行客观的“成本效益分析”很重要。

参考:
https://www.percona.com/blog/postgresql-indexes-can-hurt-you-negative-effects-and-the-costs-involved/

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

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

相关文章

AQS 抽象同步队列的简单理解

前置知识: 可重入锁又叫递归锁,同一个线程在外层方法获取锁的时候,在进入该线程内层方法会自动获取锁,不会因为之前已经获取过还没释放就阻塞 同一个线程可以多次获得同一把锁 每个锁对象都有一个锁计数器和一个指向持有该锁的…

Python爬虫-D车网近半年(六个月)汽车销量排行榜

前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏前面,笔者有单独详细介绍过该平台当前月更新的最新汽车销量排行榜数据。感兴趣的同学,可往前翻阅查看(Python爬虫-某懂车平台之汽车销量排行榜)。 而本文,笔者将详细来介绍该平台近半年…

【git】git提交代码-使用简易指南

1、创建新仓库:git init 创建新文件夹,打开执行:git init ,创建新的git仓库 2、检出仓库:git clone 执行该命令,以创建一个本地仓库的克隆版本:git clone /path/to/repository 如果是远端服务器…

一文解析Systrace 的原理、流程及定制

一、原理和基本流程 Systrace是android性能调试优化的常用工具,它可以收集进程的活动信息,如界面布局、UI渲染、binder通信等;也可以收集内核信息,如cpu调度、IO活动、中断等;这些信息会统一时间轴,在Chro…

【ROS仿真实战】Gazebo仿真平台介绍及安装方法(一)

文章目录 前言一、Gazebo简介二、Gazebo仿真平台的基本概念三、Gazebo仿真平台的安装方法四、总结 前言 Gazebo仿真平台是一个广泛应用于机器人研发、测试和教育等领域的开源软件。它可以模拟机器人的运动、感知和控制等行为,并提供了丰富的物理引擎、传感器模拟和…

PYQT5学习笔记05——QObject父子对象API以及案例

一、父子对象API 我们在这里简单演示一下父子对象API的具体用法以及代码实现,父子对象API有五个,分别是setParent、parent、children、findChild、findChildren,接下来对每一个API都具体演示一下。 1、setParent(parent)和parent() setParen…

国外导师对博士后申请简历的几点建议

正所谓“工欲善其事,必先利其器”,想要申请国外的博士后职位,就要准备好相应的申请文书材料。如果说Cover Letter是职位的窍门砖,那么申请者的简历就是争取职位的决定性筹码。 相信大家已经看过许多简历的模版了,但是…

c++自学笔记

本笔记为从菜鸟教程边学边记录的笔记---》C 教程 | 菜鸟教程 面向对象程序设计 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。…

vsftpd.conf各参数含义

文章目录 初始vsftdp.conf翻译后需修改参数write_enableYES(启用任何形式的FTP写入命令)userlist_file/etc/vsftpd.user_list、userlist_enableYES、userlist_denyNOlocal_umask022(放开权限)chroot_local_userYES(限定…

【容器文件系统】了解容器 overlay 文件系统和 /var/lib/docker/overlay2下目录的作用

转载自 浅析 Docker overlay2 文件结构 docker(5): 层 朱双印 目的 有这个问题困惑着我:容器删除 docker rm 后,docker cp 到容器内的文件,在 /var/lib/docker/overlay2 目录中是否还会存在 答案:容器删除后 docker rm 后&…

银河麒麟操作系统,安装Gitlab 基于docker

不废话。直接上干货 操作系统信息 ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Sword) Kernel: 4.19.90-24.4.v2101.ky10.aarch64 Build: Kylin Linux Advanced Server release V10 (SP2) /(Sword)-aarch64-…

【电商必学】 WhatsApp 全新攻略:什么是交互式消息模板

网购与WhatsApp等社交通讯平台有着密不可分的关系,为什么这么说呢?因为基本上所有的网购的平台都会提供查询、下单方式给客户,而WhatsApp是全世界使用率最高的通讯平台,所以大部分电子商户都会选择WhatsApp Business与电子商务连接…

「C/C++」C/C++静态链接库与动态链接库

博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录 相关术语案例环境:Win10VS2019一、链接库介绍二、静态链接库(Static Library)2.1、静态库优缺点2.2、静态库的创建2.2.1、创建静态库项目2.2.2、添加.h头文件…

实战案例分享 | 临近假期,项目突发各种问题…

五一的调休补班一下子把三个星期的作息成功打乱,大家在吐槽的同时也不忘给自己延长假期,平时加班攒下的假期都充分利用上了。但办公室的项目经理小李这两天总长吁短叹,感觉假期也要随时随地办公。一问才知原来是临近假期时,项目突…

ARL灯塔(无需VPS版)

标题随便写,能看到都是有缘人 搭建灯塔那么繁琐的步骤,远不如爆破一个灯塔是吧(狗头) 而且还可能买不起VPS的情况(例如我) 那不如写一个脚本去爆破灯塔的弱口令 整治网络安全 从你我做起 fofa语法: icon_hash"1708240621"…

零售新时代,零售行业数字化破局的新路径

深夜11点,门店店长小张还在加班,因为小张还需要盘点今日销售额、库存等信息,这些整理好的数据需要手动录入至总公司的系统中。 多门店的零售行业中,这是他们每天的工作日常:门店先通过excel做手工报表,再把…

ubuntu20.04之--CUDA的安装

文章目录 CUDA文件的下载CUDA文件下载地址 CUDA文件的安装安装结果 环境变量的配置CUDA安装结果验证 CUDA文件的下载 CUDA文件下载地址 https://developer.nvidia.com/cuda-toolkit-archive 选择合适自己电脑的版本进行下载,下载命令如下: $ wget htt…

【产品分析】如何利用咖喱外卖店铺数据进行营销分析Python

在外卖平台上经营咖喱店铺时,海量的订单数据和用户评价等信息将成为商家优化营销策略的重要依据。然而,面对大量的数据,如果没有合适的分析方法,这些数据就变得毫无意义。本文将介绍如何使用Python中常用的可视化工具和方法&#…

Stable Diffusion使用方法

SD的本地安装教程有很多我就不重复了,这里主要是记录我在使用SD Webui的过程中遇到的问题,总结的一些提升出图效率,出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 ? Ok,以上只是一小部分成品 ,属…

2023年易派客工业品展圆满落幕 期待与您再次相遇

党的二十大指出,建设现代化产业体系。坚持把发展经济的着力点放在实体经济上,推进新型工业化,加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国。 中国石化深入学习贯彻党的二十大精神,以打造世界领先洁净能源…