CodeGym /课程 /SQL SELF /删除和修改索引: DROP INDEXREINDEX

删除和修改索引: DROP INDEXREINDEX

SQL SELF
第 37 级 , 课程 3
可用

在 PostgreSQL 里删或者改索引有几种常见情况:

  • 索引太多了:如果我们建了太多用不上的索引,会拖慢 INSERTUPDATEDELETE 这些写操作。
  • 索引损坏:有时候索引会坏掉,尤其是系统崩溃或者 PostgreSQL 没正常关的时候。
  • 优化:你发现有更适合你查询的索引类型,想把旧的换掉。
  • 表结构变了:加/删表字段后,依赖这些字段的索引可能就没用了。

下面咱们就聊聊怎么用 DROP INDEXREINDEX 这俩命令来管理索引。

DROP INDEX 删除索引

DROP INDEX 命令用来从数据库里删掉一个索引。基本语法如下:

DROP INDEX [ IF EXISTS ] index_name [ CASCADE ];

详细说下:

  • IF EXISTS:加上这个选项,如果指定名字的索引不存在就不会报错,只会给个警告。
  • index_name:你要删的索引名。
  • CASCADE:表示跟这个索引有关的所有对象也会被删。一般很少用,因为索引通常没啥依赖。

例子1:简单删除索引

假设我们有个 students 表,email 字段上有个索引。现在觉得这个索引没用了,想删掉:

DROP INDEX idx_students_email;

这里 idx_students_email 就是索引名。执行完后,这个索引就从数据库里消失了。

例子2:带存在性检查的删除

如果你不确定索引在不在,可以用 IF EXISTS

DROP INDEX IF EXISTS idx_students_email;

如果索引不存在,PostgreSQL 不会报错,只会给你个警告。

例子3:试试删掉依赖对象(CASCADE)

假如有个索引和某个约束有关,比如 UNIQUE 自动建的唯一索引。如果你想删这种索引,PostgreSQL 不让你直接删,除非加上 CASCADE

DROP INDEX idx_students_email CASCADE;

注意,这种操作要小心。别随便用 CASCADE,除非你很清楚后果。

REINDEX 修改索引

REINDEX 命令用来修复那些坏掉或者过时的索引。比如文件系统出错、数据库崩溃,或者用久了索引就不行了。

基本语法

REINDEX { INDEX | TABLE | SCHEMA | DATABASE } name;

选项说明:

  • INDEX:修复指定的某个索引。
  • TABLE:修复指定表的所有索引。
  • SCHEMA:修复指定 schema 下所有表的索引。
  • DATABASE:修复当前数据库里的所有索引。

例子1:修复某个索引

如果你发现 idx_students_email 这个索引变慢了,可以修复它:

REINDEX INDEX idx_students_email;

例子2:修复整张表的所有索引

怀疑 students 表的索引都出问题了,就全修一遍:

REINDEX TABLE students;

例子3:修复整个数据库的索引

系统崩溃后,整个数据库的索引可能都坏了,这样修:

REINDEX DATABASE university;

注意: 执行这个命令需要超级用户权限。

DROP INDEXREINDEX 的小建议

自动化脚本里最好都加上 IF EXISTS,这样避免出错。

删索引前,先确认它真的没被用。可以查一下索引的使用情况:

SELECT *
FROM pg_stat_user_indexes 
WHERE indexrelname = 'idx_students_email';

小心用 CASCADE!有时候依赖的约束或对象对数据完整性很重要。

定期用 REINDEX 维护数据库,特别是经常变动的表或者大数据量的表。

可能遇到的错误

删或改索引时经常会碰到这些常见错误:

试图删除不存在的索引。 如果没用 IF EXISTS,PostgreSQL 会报错:

ERROR:  index "idx_nonexistent" does not exist

删除系统索引。 如果你不小心删了系统索引,后果很严重。比如主键字段有相关索引,不能直接删,PostgreSQL 会让你用 ALTER TABLE DROP CONSTRAINT 来删。

表被锁住。 有些 DROP INDEXREINDEX 操作会锁表,尤其是表正被别的查询用着。如果不能让表被锁,可以考虑用 CONCURRENTLY 参数建索引,而不是 REINDEX

实际项目里的用法

查询优化: 发现索引没用了就删掉,释放数据库资源。

索引清理: 开发时可能会建一堆“垃圾”索引,定期清理没用的。

性能维护:REINDEX 修复索引,让它们一直快又稳。

有了这些工具,你不仅能建索引,还能高效管理 PostgreSQL 里的索引。这是优化数据库和保证性能的重要一步。记得经常整理你的索引哦!

2
任务
SQL SELF, 第 37 级, 课程 3
已锁定
删除索引
删除索引
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION