项目中PostGreSql数据库的维护

目录

一、背景

[二、PostGreSql 数据库维护](#二、PostGreSql 数据库维护)

[2.1 清理操作VACUUM](#2.1 清理操作VACUUM)

[2.2 ANALYZE收集表的统计信息](#2.2 ANALYZE收集表的统计信息)

[2.3 重建索引REINDEX](#2.3 重建索引REINDEX)

[2.4 聚簇操作CLUSTER](#2.4 聚簇操作CLUSTER)

[2.5 实际中应用](#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;

相关推荐
转身後 默落33 分钟前
03.一键编译安装Redis脚本
数据库·redis·缓存
blurblurblun1 小时前
Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
数据库·redis·缓存
永卿0012 小时前
mysql 日志机制
数据库·mysql
先鱼鲨生2 小时前
etcd 的安装与使用
数据库·etcd
crossoverJie4 小时前
StarRocks 如何在本地搭建存算分离集群
数据库·后端
潇凝子潇4 小时前
如何在不停机的情况下,将MySQL单库的数据迁移到分库分表的架构上?
数据库·mysql·架构
ApeAssistant4 小时前
2025,Python连Oracle最新教程
python·oracle
Tapdata4 小时前
什么是 Operational Data Hub?它因何而生,又为何能够在当下成为技术共识?
数据库
这里有鱼汤4 小时前
普通人做量化,数据库该怎么选?
数据库·后端
BOOM朝朝朝5 小时前
Mongo索引
数据库·后端