当前位置: 首页 > news >正文

PostgreSQL 的 REINDEX 命令

PostgreSQL 的 REINDEX 命令

REINDEX 是 PostgreSQL 中用于重建索引的重要命令,它可以解决索引损坏、索引膨胀或性能下降等问题。

一 REINDEX 基本语法

-- 重建单个索引
REINDEX [ ( option [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] name
REINDEX [ ( option [, ...] ) ] { DATABASE | SYSTEM } [ CONCURRENTLY ] [ name ]where option can be one of:CONCURRENTLY [ boolean ]TABLESPACE new_tablespaceVERBOSE [ boolean ]-- 示例
REINDEX INDEX 索引名;
REINDEX TABLE 表名;
REINDEX SCHEMA schema;
REINDEX DATABASE 数据库名;
REINDEX SYSTEM mydb;  -- 只重建系统目录索引

二 REINDEX 的主要用途

  1. 修复损坏的索引:在硬件故障或软件错误后
  2. 解决索引膨胀:当索引因大量更新/删除而效率低下时
  3. 更改存储参数后:如修改fillfactor后需要重建生效
  4. 升级PostgreSQL后:某些版本升级建议重建索引

三 REINDEX 的工作方式

  1. 创建索引的新副本
  2. 替换旧索引(原子操作)
  3. 删除旧索引
  4. 与VACUUM FULL不同,REINDEX不会影响表数据

四 REINDEX 与 CONCURRENTLY 选项

PostgreSQL 12+ 支持并发重建索引:

-- 不阻塞读写操作
REINDEX INDEX CONCURRENTLY 索引名;-- 特点:
-- 1. 需要更多时间和资源
-- 2. 可能失败(需手动清理失败的状态)
-- 3. 不会阻止表的DML操作

五 REINDEX 的替代方案

  1. DROP + CREATE INDEX

    -- 传统方法
    DROP INDEX idx_name;
    CREATE INDEX idx_name ON table_name(column);-- 并发版本
    CREATE INDEX CONCURRENTLY idx_new ON table_name(column);
    DROP INDEX idx_old;
    ALTER INDEX idx_new RENAME TO idx_old;
    
  2. 使用 pg_repack

    pg_repack -d dbname --only-indexes -t table_name
    

输出示例:

[pg16@test base]$ pg_repack -d white --only-indexes -t yewu1.t1
INFO: repacking indexes of "yewu1.t1"
INFO: repacking index "yewu1.idx_t1"
INFO: repacking index "yewu1.idx_t1_2"

六 REINDEX 的最佳实践

  1. 维护窗口执行:普通REINDEX会锁表
  2. 对大表使用CONCURRENTLY:减少业务影响
  3. 监控进度
    SELECT * FROM pg_stat_progress_create_index;
    
  4. 重建后分析
    ANALYZE table_name;
    

七 REINDEX 的注意事项

  1. 锁问题

    • 普通REINDEX获取排他锁
    • CONCURRENTLY模式使用ShareUpdateExclusiveLock
  2. 空间需求

    • 需要额外空间存储新旧两个索引
  3. 系统目录索引

    • 重建系统目录索引需要特殊权限
  4. 复制环境

    • 在主库执行REINDEX会生成大量WAL

更多详细信息请查看官方文档:

https://www.postgresql.org/docs/16/sql-reindex.html

REINDEX 是 PostgreSQL 数据库维护的重要工具,合理使用可以显著提升查询性能并解决索引相关问题。

谨记:心存敬畏,行有所止。

http://www.xdnf.cn/news/279901.html

相关文章:

  • 装饰模式(Decorator Pattern)
  • 【C++】运算符重载
  • 图片压缩与尺寸调整的便捷工具推荐
  • 主成分分析(PCA)与逻辑回归在鸢尾花数据集上的实践与效果对比
  • 【翻译、转载】MCP 工具 (Tools)
  • 【python实用小脚本-47】用Python打造高效的信息推送系统:从问题到解决方案的实战之旅
  • 【默子AI】Anthropic Claude LLM对齐伪装 解读
  • Temp Mail 1.7.0 | 创建和管理临时邮箱,防止垃圾邮件骚扰,保护隐私安全
  • 高效便捷的定时关机与任务管理工具
  • Java学习手册:MyBatis 框架作用详解
  • 【循环依赖(Circular Dependency)】
  • 2025信息安全网络安全意识培训资料汇编(24份)
  • Day 4:牛客周赛Round 91
  • 力扣刷题(第十六天)
  • Mamba+Attention+CNN 预测模型:破局长程依赖的计算机视觉新范式
  • 24:条码解析
  • 深度剖析:丝杆升降机与齿条的传动特性、应用场景及选型策略
  • go语言实现用户管理系统
  • [计算机网络]拓扑结构
  • Allegro23.1新功能之如何去除钻孔表中一钻钻头孔径和公差操作指导
  • Qt输入控件(QInput Widgets)详解:从基础到实战
  • 前端面经-VUE3篇(三)--vue Router(二)导航守卫、路由元信息、路由懒加载、动态路由
  • idea创建springboot项目无法创建jdk8原因及多种解决方案
  • 递归下降算法
  • 结构型模式:外观模式
  • Python 数据智能实战 (12):效果评估 - 超越传统指标
  • 平台介绍-开放API接口-IO说明
  • 阿里云服务器全栈技术指导手册(2025版)
  • 基于 PyQt 的YOLO目标检测可视化界面+ nuitka 打包
  • Spring AI 实战:第六章、Spring AI源码浅析之一山可容二虎