温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何删除无用的数据库索引

发布时间:2026-11-01 20:51:24 来源:亿速云 阅读:94 作者:小樊 栏目:数据库

删除无用的数据库索引,通常需要先识别、再评估、最后安全删除。下面按常见数据库(MySQL / PostgreSQL / SQL Server)给你一套通用做法和命令示例。


一、如何识别“无用索引”

1. 长期未被使用的索引

MySQL

-- 查看索引使用情况(需开启 performance_schema)
SELECT
  object_schema,
  object_name,
  index_name,
  COUNT_FETCH
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE index_name IS NOT NULL
  AND COUNT_FETCH = 0;

PostgreSQL

-- pg_stat_user_indexes
SELECT
  schemaname,
  relname,
  indexrelname,
  idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0;

SQL Server

SELECT
  OBJECT_NAME(i.object_id) AS table_name,
  i.name AS index_name,
  s.user_seeks,
  s.user_scans,
  s.user_lookups
FROM sys.indexes i
JOIN sys.dm_db_index_usage_stats s
  ON i.object_id = s.object_id AND i.index_id = s.index_id
WHERE s.user_seeks + s.user_scans + s.user_lookups = 0;

⚠️ 注意:刚重建或新建的库可能数据不准确,建议观察 至少 1–2 个业务周期。


2. 重复或冗余索引

例如:

  • (a)
  • (a, b)
  • (a) include (b)

后两者可能使前者冗余。

MySQL

可借助工具:

  • pt-duplicate-key-checker
pt-duplicate-key-checker --user=xxx --password=xxx

PostgreSQL

手动分析 pg_index 或使用 pg_stat_statements 辅助判断。


二、删除前的评估(非常重要)

删除索引前确认:

  1. 是否是唯一索引 / 主键
    • 唯一索引可能影响数据约束
  2. 是否被外键引用
  3. 是否有定时任务 / 报表依赖
  4. 删除后写性能是否提升明显
    • 索引会降低 INSERT / UPDATE / DELETE 速度

建议:

  • 先在测试环境删除
  • 或先 禁用(如 SQL Server)观察

三、删除索引的语法

MySQL

ALTER TABLE table_name DROP INDEX index_name;

PostgreSQL

DROP INDEX index_name;
-- 或
DROP INDEX CONCURRENTLY index_name;  -- 不锁表(推荐)

SQL Server

DROP INDEX index_name ON table_name;

四、安全删除建议流程

  1. 统计索引使用率(≥2周)
  2. 找出 使用次数 = 0 的索引
  3. 排除:
    • 主键
    • 唯一约束
    • 外键索引
  4. 在测试环境验证
  5. 低峰期删除
  6. 删除后监控:
    • 查询变慢?
    • CPU / IO 是否异常?

五、常见误删场景提醒

  • 看似“没用”,但用于 ORDER BY / GROUP BY
  • 用于覆盖索引(Covering Index)
  • 用于强制索引提示的 SQL

如果你告诉我:

  • 使用的数据库类型
  • 大致数据量
  • 是否生产环境

我可以帮你写一套可直接执行的检测 + 删除脚本。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手