首页/数据/SQL 速查/DROP INDEX 前的依赖检查
变更与事务52 条

DROP INDEX 前的依赖检查

索引可能承担唯一约束或支撑外键:删除前确认约束依赖与使用情况,避免删出约束失效或外键报错。

SQL 速查数据更新于 2026-10-13

删索引为什么要先检查

索引不只是查询加速:唯一索引通常承担 UNIQUE 约束,外键也要求被引用列上有索引。直接 DROP INDEX 可能顺手删掉业务约束,或者因为外键依赖而执行失败。正确顺序是先查清「谁在用这个索引、它承担什么角色」,再决定删除、改成普通索引还是保留。

基本信息

MySQL 查看SHOW INDEX FROM 表 看索引名与唯一性
PostgreSQL 查看pg_index 与 pg_constraint 查约束依赖
唯一索引删除即失去唯一性保证
外键要求MySQL 外键需要被引用列上有索引,缺了无法删除
删除语法MySQL ALTER TABLE ... DROP INDEX;PG DROP INDEX 或 DROP CONSTRAINT

典型使用场景

  • 清理冗余或重复索引,降低写入维护开销
  • 下线前做验证:先隐藏再删除
  • 调整复合索引列序,先删旧索引再建新索引
  • 解除误建的唯一约束,恢复正常写入
  • 按慢写排查结果清理长期未使用的索引

MySQL 检查与删除

MySQL 检查与删除
SHOW INDEX FROM users;        -- 看索引名、列顺序与 Non_unique 列
SHOW CREATE TABLE users;      -- 看索引由哪条约束创建

-- 普通索引可以直接删除
ALTER TABLE users DROP INDEX idx_status;
-- 报 1553 说明它是外键所需索引,要先处理外键或换一个可覆盖的索引

PostgreSQL 检查与删除

PostgreSQL 检查与删除
-- 查依赖该索引的约束
SELECT conname, contype
FROM pg_constraint
WHERE conindid = 'uk_users_email'::regclass;

-- 由约束创建的索引不能直接 DROP,须先删约束(索引随之消失)
ALTER TABLE users DROP CONSTRAINT uk_users_email;
-- 普通索引直接删
DROP INDEX idx_users_status;

索引来源与删除方式

索引来源能否直接删正确做法
普通二级索引可以DROP INDEX 语句直接删
UNIQUE 约束创建的索引MySQL 可删(约束随之消失);PG 不行PG 走 ALTER TABLE ... DROP CONSTRAINT
主键索引不能先改主键定义
外键依赖的索引视情况先删外键,或保留能被外键复用的索引
删除唯一索引等于移除数据库层去重:如果应用依赖它拦重复数据,删除后重复值会被静默写入,事后清理代价很高。删前先确认业务是否真的不依赖。
MySQL 8.0 可以先把索引设为 INVISIBLE 做灰度验证;PostgreSQL 没有不可见索引,可观察 pg_stat_user_indexes 的扫描计数,再决定是否删除。

易错点

  • 直接删掉由 UNIQUE 约束创建的唯一索引:唯一性保证随索引消失,重复数据可能被写入且应用不会报错
  • 在 PostgreSQL 里对约束索引执行 DROP INDEX:会被直接拒绝,必须先 DROP CONSTRAINT,或用 CASCADE 连带删约束(更危险)
  • 删到外键所需索引导致语句失败:MySQL 会报 1553,需先删外键或换一个能覆盖的索引
  • 只看「索引没被用到」就删:统计在重启后会清零、口径也有延迟,低峰期长窗口观察才可靠
  • 一次删多个索引且不留回退路径:大表重建索引耗时长、占用资源,删除前把建索引语句记下来便于快速恢复

数据来源与参考

  • MySQL 8.0 Reference Manual · DROP INDEX Statement
  • PostgreSQL Documentation · ALTER TABLE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌