【YUNBEE云贝技术分享】如何定位postgreSQL数据库中未被使用过的索引

news2024/9/22 21:34:01

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

前言

在生产环境上,由于不规范的优化措施,数据库中可能存在大量的索引,并且相当一部分的索引重未被使用过,今天带大家如何找出这些索引。

一、存在大量未使用的索引带来的危害

在PostgreSQL中,存在大量未使用的索引可能会带来以下几个问题:

1. 性能下降:每当对表进行插入、删除或更新操作时,相关的索引都需要被更新。如果有大量未使用的索引,这些索引的维护工作可能会消耗大量的CPU和I/O资源,导致数据库性能下降。

2. 占用存储空间:索引本身会占用存储空间。如果有大量未使用的索引,这些索引会浪费大量的磁盘空间,可能导致存储成本增加。

3. 影响查询优化器的决策:PostgreSQL的查询优化器在决定查询执行计划时,会考虑所有可用的索引。如果有大量未使用的索引,可能会增加查询优化器的计算复杂度,影响其决策的效率和准确性。

4. 备份和恢复时间增加:如果有大量未使用的索引,备份和恢复数据库的时间可能会增加,因为索引数据也需要被备份和恢复。

因此,定期审查和清理未使用的索引是一个很好的数据库维护实践。但在删除索引之前,需要确保这些索引真的不再需要,因为有些索引可能只在特定的查询或特定的时间(如每月的报表生成)中被使用。

二、实战案例

接下来,我们以实际案例来演示索引过多带来的性能影响

2.1 创建带索引的表

图片

2.2 创建不带索引的表

图片

2.3 插入数据测试

图片

上面结果可以看出,同样结构的表,插入数据的操作,有无索引的性能相关近5倍!

2.4 修改数据测试

图片

上面结果可以看出,同样结构的表,修改数据的操作,有无索引的性能相关近3倍!

2.5 查看此时表的体积

图片

因为索引的原因,t1的体积更大。

三、索引使用的规则

PostgreSQL的查询优化器使用一种称为成本优化的方法来决定是否使用索引,以及选择使用哪个索引。以下是一些影响PostgreSQL使用索引的主要因素:

1. 查询的选择性:索引对于高选择性的查询最有用。选择性是指查询结果返回的记录占表中总记录的比例。例如,如果你正在查询一个人口为几十亿的国家中的一小部分人,这个查询就有很高的选择性,使用索引会很有帮助。相反,如果你正在查询的数据占总数据的大部分,那么全表扫描可能会更快。

2. 索引类型:PostgreSQL支持多种类型的索引,包括B-tree、Hash、GiST、SP-GiST、GIN和BRIN。每种索引类型都有其特定的用途和优势。例如,B-tree索引适用于等于、大于、小于等操作,而GIN索引适用于数组和全文搜索。

3. 数据分布:如果表中的数据分布不均匀,索引可能会更有效。例如,如果一个字段的值大部分都是唯一的,那么对这个字段创建索引可能会很有帮助。

4. 索引大小和深度:大的索引需要更多的磁盘I/O操作来读取,而深的索引需要更多的磁盘I/O操作来遍历。因此,如果一个索引很大或很深,查询优化器可能会选择不使用它。

5. 硬件和系统配置:硬件的性能(如CPU速度、内存大小、磁盘速度等)和PostgreSQL的配置(如工作内存、随机页面成本等)也会影响查询优化器的决策。

6. 统计信息:PostgreSQL的查询优化器使用统计信息来估计查询的成本。这些统计信息包括表的大小、索引的大小、数据的分布等。如果这些统计信息不准确,查询优化器可能会做出错误的决策。

最后,要注意的是,查询优化器的目标是尽可能快地返回查询结果,而不一定是尽可能少地读取磁盘页面。因此,有时候即使存在索引,查询优化器也可能选择全表扫描,因为它认为这样会更快。

四、如何找出未使用的索引

在pgv16的版本中,有一个视图pg_stat_user_indexes可以查看索引使用情况

图片

查看当前索引使用的频率

图片

调用索引再次查看

图片

SQL的执行计划中显示调用了索引idx_a ,查询pg_stat_user_indexes结果显示索引的扫描次数没有增加,为什么?原来explain并未真正执行SQL。

那加上analyze参数

图片

在v16之前的版本中,pg_stat_user_indexes.last_idx_scan字段是没有的,只能通过手工编写脚本来记录索引扫描时间,也可以通过SELECT pg_stat_reset()函数重置索引的使用记录,人工观察一周来排查。这里不再赘述。

五、总结

通过以上实验,我们知道了表上索引过多的危害及如何定位未使用索引的方法,对pg数据库的索引有进一步的了解。

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

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

相关文章

jeecgboot 开放页面权限,免登录访问

前端需要配置路由和添加白名单 1、配置路由 2、 在permission.js里,把刚才的路由添加到白名单 3、 后端需要把该页面涉及到的接口排除权限拦截 比如我这个页面涉及到两个接口: 那么就在后端的excludeUrls把这两个接口加进去。 前端后端都设置好了&…

idea实现ssh远程连接服务器

1. 首先,打开idea,点击左上角File->settings 2. 点击tools->SSH Configurations->填写必要的信息,Host就是访问服务器的ip地址,Username就是服务器的用户账户,比如root,Password账户对应的密码&am…

智慧城市与绿色出行:共同迈向低碳未来

随着城市化进程的加速,交通拥堵、空气污染、能源消耗等问题日益凸显,智慧城市与绿色出行成为了解决这些问题的关键途径。智慧城市利用信息技术手段,实现城市各领域的智能化管理和服务,而绿色出行则强调低碳、环保的出行方式&#…

【Golang】golang使用三方SDK操作容器指南

【Golang】golang使用三方SDK操作容器指南 大家好 我是寸铁👊 总结了一篇 golang使用三方SDK操作容器✨ 喜欢的小伙伴可以点点关注 💝 这应该是目前全网最全golang使用三方SDK操作容器的指南了✌️ CreateConfig 主要是创建容器的配置信息,常…

【Java从发入门到精通】Java StringBuffer 和 StringBuilder 类

Java StringBuffer 和 StringBuilder 类 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。 在使用 Stri…

#QT(QSpinBox,QDoubleSpinBox)

1.IDE:QTCreator 2.实验:实现一个计价工具,进制转换工具。 教程来自:阿西拜编程 QT C 5.9 3.记录 设置进制的第二种方法 ui->hex_tx->setDisplayIntegerBase(16); //设置显示进制为16进制 4.代码 widget.cpp #include "wi…

NOIP2018-S-DAY1-3-赛道修建(洛谷P5021)的题解

目录 题目 原题描述: 题目描述 输入格式 输出格式 输入输出样例 主要思路: check: 真正的code: 原题描述: 题目描述 C 城将要举办一系列的赛车比赛。在比赛前,需要在城内修建 条赛道。 C 城一共有 个路…

天梯赛的赛场安排(Python)

作者 陈越 单位 浙江大学 天梯赛使用 OMS 监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担&#…

打造私人云笔记,创造舒适的写作空间

搭建Minio 图片文件服务器 (树莓派4B搭建Minio公网云服务器用nps内网穿透)Typora 安装客户端 --> 可以利用免费gitee管理文档利用Typora 图像自定义文件上传功能 Minio强大的API功能 一、树莓派4B 64bit raspberry 操作系统 Docker Minio 图片文件…

CentOS本地部署Tale博客并结合内网穿透实现公网访问本地网站

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale,Tale…

Python 配置信息的添加和获取

1.效果如下: 2.代码如下: from configparser import ConfigParser import threadingclass Config():_instance_lock threading.Lock()classmethoddef instance(cls, *args, **kwargs):if not hasattr(Config, "_instance"):with Config._ins…

ELK 基本操作

文章目录 1.Elasticsearch-head2.Kibana2.1.功能简介2.2.Management2.3.Discover2.4.Dev Tools 开源中间件 # Elastic Stackhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/elk/elk-use/1.Elasticsearch-head 2.Kibana 2.1.功能简介 2.2.Man…

电脑桌面便签下载,电脑桌面便签软件哪个好

电脑桌面便签下载,电脑桌面便签软件哪个好?在日常工作生活中,我们经常会遇到许多琐碎的事情需要记录和安排,这时候电脑桌面便签就成为了一个不可或缺的工具。而如今,在电脑时代的今天,电脑桌面便签软件更是…

扭蛋机小程序,扭蛋与互联网结合下的商机

扭蛋机作为一种娱乐消费模式,受众群体不再局限于儿童,也吸引了众多的年轻消费者。扭蛋机具有较大的随机性,玩具商品随机掉落,在购买前消费者完全不知道扭蛋中的商品是什么,这种未知性带来的惊喜感是吸引众多消费者的主…

MyBatis框架2

目录 一、Sql编写高级特性-批量增删 1.SQL-foreach-批量删除 1.1.批量删除方法 1.2编写SQL 1.3.编写测试 2.动态SQL-foreach-批量插入 2.1.映射器批量插入方法 2.2.编写SQL 2.3.编写测试 二、Sql编写高级特性-多对一 1.多对一保存 1.1.创建员工部门Domain 1.2.创建员…

远程同声传译如何实现?哪里提供专业的远程同声传译?

远程同传声传译,即线上同传翻译,是指翻译员通过非现场的网络方式进行的同声传译(实时翻译)。远程同声传译的实现依赖于一系列先进的技术手段和高效的协作流程。这一服务模式的出现,不仅打破了传统同声传译的地域限制,还为全球范围…

【JavaEE Spring 项目】消息队列的设计

消息队列的设计 一、消息队列的背景知识二、需求分析核心概念⼀个⽣产者, ⼀个消费者N 个⽣产者, N 个消费者Broker Server 中的相关概念核⼼ API交换机类型 (Exchange Type)持久化⽹络通信消息应答 三、 模块划分四、 项⽬创建五、创建核心类创建 Exchange创建 MSGQUeue创建 B…

9个免费游戏后端平台

在这篇文章中,您将看到 九个免费的游戏服务平台提供商,这可以帮助您开始在线多人游戏,而无需预先投入大量资金。 每个提供商都有非常独特的功能,因此成本应该只是决定时要考虑的方面之一。 我还从低预算项目的角度对免费提供商进…

基于单片机的篮球计分器设计

在当今的体育赛事中,比赛的计分系统对观众和运动员尤为重要,观众可以根据比分的实时显示为自己支持的队伍呐喊助威,运动员更是要靠着计分器来把握比赛的节奏,包括攻防转换、替补换人以及赛间休息等等。因此,为了让比赛进行得更加专业化和流畅化,我们有必要对比赛的计分系…

基于深度学习的鱼类分类检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8 yolov8主要包含以下几种创新:         1. 可以任意更换主干结构,支持几百种网络主干。 数据集:     网上下载的数据集&#x…