PostgreSQL 如何对索引进行分析和处理

news2025/1/9 14:33:11

15ec9f26a9aba5143024434947beffed.png

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

最近有人私信问POSTGRESQL 怎么比MYSQL的索引大,这个问题升级上我个人觉得从这几点考虑

1  一个数据库本身的索引提供什么样的功能,是否有为加速查询附加的信息。

2   POSTGRESQL 数据库中的数据索引的结构是否与你在其他的数据库中使用的索引的结构不同

3  POSTGRESQL 的索引还负担了MVCC多版本控制查询中所需要的信息,所以本身的设计也让他比其他的数据库的索引要更大

4  索引的字段中如果包含TOAST 字段,是不会引起索引的包含TOAST的内容的,因为索引是通过指针的方式指到TOAST的字段位置

那么具体怎么分析索引的问题,我们可以通过以下的语句来进行一些简单的问题

1   如何一个SQL将索引中的核心信息一网打尽,实际上很多的同学问,怎么能知道索引中的字段组成,这你PG与MYSQL不同,可以单纯的通过系统表来获得这些信息,而是通过很多不同的函数来完成相关的工作,如我们要获得索引的字段组成,同时发现PG中表的一些特殊索引建立的方式,就必须用下面的这个语句。

56a19bd2c0ac1d21a2daa0fa8aa3711b.png

SELECT
    t.schemaname,
    t.tablename,
    c.reltuples::bigint                            AS num_rows,
    pg_size_pretty(pg_relation_size(c.oid))        AS table_size,
    psai.indexrelname                              AS index_name,
    pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,
    CASE WHEN i.indisunique THEN 'Y' ELSE 'N' END  AS "unique",
    psai.idx_scan                                  AS number_of_scans,
    psai.idx_tup_read                              AS tuples_read,
    psai.idx_tup_fetch                             AS tuples_fetched,
    pg_catalog.pg_get_indexdef(i.indexrelid, 0, true)   as  create_index
FROM
    pg_tables t
    LEFT JOIN pg_class c ON t.tablename = c.relname
    LEFT JOIN pg_index i ON c.oid = i.indrelid
    LEFT JOIN pg_stat_all_indexes psai ON i.indexrelid = psai.indexrelid
WHERE
    t.schemaname NOT IN ('pg_catalog', 'information_schema') and t.tablename = 'sys_log'
ORDER BY 1, 2;

如果这个语句不好记忆的话,可以采用VIEW的方式来提高这样的语句的使用效率如下面我们通过VIEW 来把这个SQL进行一个封装

CREATE OR REPLACE VIEW index_check AS
SELECT
    t.schemaname,
    t.tablename,
    c.reltuples::bigint                            AS num_rows,
    pg_size_pretty(pg_relation_size(c.oid))        AS table_size,
    psai.indexrelname                              AS index_name,
    pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,
    CASE WHEN i.indisunique THEN 'Y' ELSE 'N' END  AS "unique",
    psai.idx_scan                                  AS number_of_scans,
    psai.idx_tup_read                              AS tuples_read,
    psai.idx_tup_fetch                             AS tuples_fetched,
    pg_catalog.pg_get_indexdef(i.indexrelid, 0, true)   as  create_index
FROM
    pg_tables t
    LEFT JOIN pg_class c ON t.tablename = c.relname
    LEFT JOIN pg_index i ON c.oid = i.indrelid
    LEFT JOIN pg_stat_all_indexes psai ON i.indexrelid = psai.indexrelid
WHERE
    t.schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY 1, 2;

5ff19238cdf4a51d41e585d76acc84fd.png

 select * from index_check where tablename = 'sys_log';

通过这样的方式可以更快速的对于系统中的表进行索引的分析和辨认,对于索引的日常维护对于系统也是非常重要的,尤其是POSTGRESQL在一些项目中,有一些查询并不是一直存在,业务逻辑下线后,这个语句就不会再执行了,但是对于当时为这个语句建立的索引还在系统中存在,及时发现这些索引,并将其确认清理也是一个系统优化中的必须得工作。

c0028e700d3382ca3d0a2457995c50f5.png

SELECT relname AS index_name,
idx_scan, pg_size_pretty(pg_relation_size(indexrelid)) AS index_size,
idx_tup_read,
idx_tup_fetch
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;

这里提出几个需要考虑的地方

上面的语句可以发现索引是否持续的被使用,我们可以建立一个索引的历史分析表,每天将表中的内容插入到历史表中,然后定期分析,通过历史分析表中,同一个索引,不同时间的增量来判断这个索引是否还在被使用,专业也是一个发现无用索引的方案。

1 你的系统数据库运行到当前时间的长度,因为系统的表中的数据会伴随你系统的重启而清零,所以你得程序设计的逻辑中必须考虑这点

2 历史数据的合并与累加,因为历史表不能无限的进行增加,这与你截取系统表数据进行记录的频度有关,所以你需要考虑后期的数据合并的问题

3  判定提醒的阈值

当然对于POSTGRESQL 的索引的碎片我们也是要进行监控和管理的,索引的碎片太多,造成查询的效率降低,我们是要进行持续的定期的检查和重建相关的索引,这你分析的部分就需要自己写程序来进行后期的处理了。

CREATE EXTENSION pgstattuple; 在使用下面的函数前请确认是否在PG

的数据库中存在pgstattuple extension

SELECT * FROM pgstatindex('idx_sys_log_moduleid');
3d1eb3148d2194c0953de52ca48ef77e.png

对于索引的性能优化还需要考虑 

重复的索引导致的系统的资源的浪费的问题.

SELECT pg_size_pretty(sum(pg_relation_size(idx))::bigint) as size,
       (array_agg(idx))[1] as idx1, (array_agg(idx))[2] as idx2,
       (array_agg(idx))[3] as idx3, (array_agg(idx))[4] as idx4
FROM (
    SELECT indexrelid::regclass as idx, (indrelid::text ||E'\n'|| indclass::text ||E'\n'|| indkey::text ||E'\n'||
                                         coalesce(indexprs::text,'')||E'\n' || coalesce(indpred::text,'')) as key
    FROM pg_index) sub
GROUP BY key HAVING count(*)>1
ORDER BY sum(pg_relation_size(idx)) DESC;

33b1cfee465fc73b2fec107770a8acf8.png

以上是基本的POSTGRESQL 针对索引优化的基本姿势。

ffaa181737806dd67c5dd5cc6d1c24d0.png

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

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

相关文章

智慧煤矿4G物联网方案,矿山矿井远程监控管理4G网关应用

随着经济发展煤矿需求不断激增,矿山矿井普遍处于偏远山区,生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题,利用网关对现场终端设备连接组网,实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛,户外环境…

《Opencv3编程入门》学习笔记—第八章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第八章 图像轮廓与图像分割修复 一、查找并绘制轮廓 一个轮廓一般对应一系列的点,也就是图像中的一条曲线,其表示方法可能根据不同的情况而有所不…

FFmpeg 播放器实现音视频同步的几种方式

我们基于 FFmpeg 利用 OpenGL ES 和 OpenSL ES 分别实现了对解码后视频和音频的渲染,本文将实现播放器的最后一个重要功能:音视频同步。 老人们经常说,播放器对音频和视频的播放没有绝对的静态的同步,只有相对的动态的同步&#…

深度学习管理工具

1. mlflow https://zhuanlan.zhihu.com/p/363673389 官方文档: https://www.mlflow.org/docs/latest/index.html https://zhuanlan.zhihu.com/p/67173051 在跟踪实验时,通过运行 mlflow ui 后在 http:// localhost:5000 中进行…

ranger,hive,hdfs的三者的权限管理

ranger,hive,hdfs的三者的权限管理 情况一:连接datagrip 用户在hdfs上的权限 可以看出只给了用户write权限,尝试登录xwq用户,在datagrip上登录成功 经过实验验证:要想使用datagrip或者hive-cli登录hive…

C++11【一】

文章目录 一、C11简介二、右值引用三、可变参数模板四、 empacle_back(移动构造/赋值)五、简单特性 一、C11简介 C11是C编程语言的一个版本,于2011年发布。C11引入了很多新特性,比如:类型推导(auto关键字)、Lambda表达式、线程库、列表初始化…

电源浪涌保护器加装后备保护器的作用

随着现代化技术的发展,信息化系统集成度越来越高。设备敏感度高,抗冲击能力低,极易受到电涌脉冲的危害。电涌保护器(SPD)作为专业的防电涌产品,应用越来越广,SPD的应用涉及很多的专业知识&#…

孩子创新思维秘籍

头脑风暴最重要的原则之一就七个字, 要数量,不要质量。 意思就是说,你尽可能的去胡思乱想,胡说八道,天马行空就对了。 我们从这一大堆古灵精怪的玩意儿里面去筛选那些真正有价值的东西,可以拓展的方案。 然…

【技术选型】Redis的几种集群方案、及优缺点对比

文章目录 背景一、主从模式二、哨兵模式三、Redis Cluster四、各大厂的Redis集群方案客户端分片代理分片Codis 五、Redis集群方案解决方案六、Redis集群方案原理总结 背景 在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上&#xff0…

GCP学习笔记(二)——大数据和机器学习

文章目录 一、数据读取和处理1.Pub/Sub代码实践PublishingSubscribing 2. Dataflow使用Python搭建Pipeline 3. Dataproc4. Cloud Data Fusion5. 其他工具Cloud Composer (Apache Airflow)Cloud Scheduler 二、可视化与分析1. Looker2. Looker Studio3. B…

【数据结构与算法C++实现】2、二分查找与简单递归

原视频为左程云的B站教学 文章目录 1 二分法1.1 在有序数组中查找特定元素1.2 在一个有序数组中查找>某个数的最左侧的位置1.3 在一个有序数组中查找<某个数最右侧位置1.4 局部最小值问题&#xff08;无序数组使用二分法的案例&#xff09; 2 简单的递归思想 1 二分法 …

在AI热潮中,过早的卖掉Datadog股票是个非常错误的决定

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 Datadog股价 Datadog&#xff08;DDOG&#xff09;目前的股价比其历史高点低了50%左右&#xff0c;比近期低点高了50%左右。 猛兽财经上次关注Datadog是在4月份&#xff0c;当时由于该股的增长前景已经恶化&#xff0c;所以…

windows电脑hbuilderx打包iOS app及上架app store教程

ios应用&#xff0c;无法像安卓应用一样&#xff0c;上传到自己的服务器让互联网用户下载进行安装&#xff0c;所以需要将生成的app上传到app store&#xff0c;然后用户到app store安装app。 由于官网的教程是使用mac电脑生成证书和上架的&#xff0c;但是很多使用hbuilderx打…

实践指南 | 风控引擎快速接入不同数据源的操作说明

随着互联网垂直电商、消费金融等领域的快速崛起&#xff0c;用户及互联网、金融平台受到欺诈的风险也急剧增加。网络黑灰产已形成完整的、成熟的产业链&#xff0c;每年千亿级别的投入规模&#xff0c;超过1000万的“从业者”&#xff0c;其专业度也高于大多数技术人员&#xf…

Templates 虽然工具将近被淘汰,但依然会有一些场景会被使用-eclipse 格式化注释

Templates 是一款-eclipse 格式化注释模板。虽然工具将近被淘汰&#xff0c;但依然会有一些场景会被使用&#xff0c;今天就来分享一下自己用过的一款&#xff0c;已经去掉不常用的&#xff0c;保留必要的模板内容。 设置方法如下&#xff1a; 设置Code Templates&#xff0c…

Java-定时任务

文章目录 补充&#xff1a;cron表达式基本知识方式一&#xff1a;使用sleep方法方式二&#xff1a;JDK Timer和TimerTask方式三&#xff1a;JDK ScheduledExecutorService方式四&#xff1a; Spring Task 中 的 Scheduler方法五、Quartz框架方式六&#xff1a;XXL-JOB将xxl-job…

canvas实现简易画板

效果图如下&#xff1a; 实现功能&#xff1a; 1、改变画笔粗细 2、保存签名实现下载功能 3、使用橡皮擦功能 4、清空画布 5、改变画笔颜色 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta …

ChatGPT新功能曝光:可记住用户信息、上传文件和工作区

&#x1f989; AI新闻 &#x1f680; ChatGPT新功能曝光&#xff1a;可记住用户信息、上传文件和工作区 摘要&#xff1a;一张神秘截图曝光了ChatGPT新功能&#xff0c;包括可记住用户信息的"My profile"、上传和管理文件的"My files"以及可以让AI使用不…

从Wi-Fi,蓝牙,到4G,5G,到卫星网络,频谱共享已无处不在

在智能手机像牙刷一样普及的今天&#xff0c;频谱共享&#xff0c;成为了近些年通信界的一个热词儿。频谱因为通信的重要而变得越发重要&#xff0c;又因为频谱是一种稀缺资产&#xff0c;而使用需求又在日益飞速地增长&#xff0c;所以成为重中之重。智能手机、物联网、军事和…

【QT】枚举常用宏到底有什么作用?(Q_ENUM,Q_FLAG,Q_DECLARE_FLAGS,Q_DECLARE_OPERATORS_FOR_FLAGS)

目录 1. Q_ENUM宏 与 QMetaEnum类1.1 Q_ENUM宏的作用1.2 使用Q_ENUM注意的问题1.3 在写有关枚举的代码时&#xff0c;我们可能遇到这种情况&#xff1a;需要用到枚举的字符串&#xff0c;该怎么办&#xff1f;1.4 下面通过一段简单的代码来说明Q_ENUM的作用 2. Q_FLAG宏2.1 Q_F…