项目中PostGreSql数据库的维护

发布于:2025-06-20 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一、背景

二、PostGreSql 数据库维护

2.1 清理操作VACUUM  

2.2 ANALYZE收集表的统计信息

2.3 重建索引REINDEX

2.4 聚簇操作CLUSTER

2.5 实际中应用


一、背景

        实际交通项目中PostGreSql数据库中的车辆相关数据每天不断更新增加,长此以往数据库的查询插入更新等效率会逐渐增加,相关数据库操作的TimeBenck也会频频爆出耗时日志。除此之外磁盘存储的坏道,数据的丢失,索引的损坏,数据库的断电崩溃等等也会引起数据库连接问题,对于一些大型商业停车场会带来较大的损失。以下记录实际中常用的一些排查维护方法。


二、PostGreSql 数据库维护


2.1 清理操作VACUUM  

        VACUUM 操作的主要目的是回收数据库中不再使用的空间,并优化数据库的性能,减少表的膨胀,具体原理如下:

        标记和删除:扫描数据库中的表和索引,标记所有不再使用的行和页面。
        重建表和索引:将未被标记的行和页面复制到新的存储位置,从而释未使用的空间。
        更新统计信息:重新计算数据库的统计信息,以便优化查询计划。
        具体使用:
            VACUUM;
            -- 或者针对特定表
            VACUUM table_name;


2.2 ANALYZE收集表的统计信息


        ANALYZE 命令用于收集表的统计信息,这些信息对于查询优化器生成高效的查询计划非常重要。它会扫描整个表并收集数据分布的信息,如最小值、最大值、空值比例等。

        数据采样:ANALYZE 命令会从表中随机抽取一定数量的数据样本。默认情况下,PostgreSQL 会从每个表的每一列中抽取大约 1% 的数据。
        统计信息收集:通过分析这些样本数据,PostgreSQL 可以计算出各种统计信息,包括:列的最小值和最大值,不同值的数量和空值的比例等
        存储统计信息:这些统计信息会被存储在系统目录中,供查询优化器使用。
        作用:通过提供最新的统计信息,ANALYZE 可以帮助查询优化器选择最佳的查询执行计划,从而提高查询性能。
        自动维护:在大多数情况下,PostgreSQL 会自动运行 ANALYZE 命令,特别是在大量数据变更后。然而,手动运行 ANALYZE 可以确保统计信息是最新的,尤其是在数据分布发生显著变化时。

       具体使用:

                ANALYZE;
                -- 或者针对特定表
                ANALYZE table_name

2.3 重建索引REINDEX

        REINDEX 命令用于重建索引,这在索引变得碎片化时特别有用,可以显著提高查询性能。通常在大量插入、更新和删除操作后使用。
        主要用途:
        1.优化性能:随着数据的插入、更新和删除操作,索引可能会变得碎片化,导致查询性能下降。通过 REINDEX,可以重新构建这些索引,从而恢复其性能。
        2.修复损坏的索引:如果索引由于某些原因(如硬件故障或数据库崩溃)而损坏,可以使用 REINDEX 来修复。
        3.更新统计信息:在执行 REINDEX 时,PostgreSQL 会同时更新与索引相关的统计信息,这对于查询优化器来说非常重要。

         具体使用:

                REINDEX TABLE table_name;
                -- 或者重建所有索引
                REINDEX DATABASE database_name;

2.4 聚簇操作CLUSTER

        当表数据在磁盘上的顺序与索引顺序不匹配时,查询可能会变得较慢,聚簇(Clustering)是一种物理存储优化技术,通过将相关的数据行存储在相同的物理块上,从而减少磁盘I/O操作,提高查询性能,但CLUSTER 是一个耗时的操作,避免在高负载时运行。

        具体原理: CLUSTER 命令会创建一个新的临时表,将原表中的数据按照指定的索引顺序插入到新表中。然后,它会用新表替换旧表。这个过程包括读取、排序和写入数据,消耗大量的 I/O 资源和时间。

        具体使用:
                CLUSTER table_name USING index_name

2.5 实际中应用

        在实际项目中,对于现场中数据库索引失效、断电崩溃、查询较慢等等影响现场运行的问题常常可以采用以上方式临时修复,保证现场正常运行在图后续优化改进。此外这些命令通常会结合使用以保持数据库的性能和健康状态。比如可以在定期维护窗口期内运行以下命令,也可以在每次软件退出或启动前运行。
        VACUUM ANALYZE;
        REINDEX TABLE my_table;
        CLUSTER my_table USING my_index;

   


网站公告

今日签到

点亮在社区的每一天
去签到