温馨提示×

温馨提示×

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

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

如何删除无用索引

发布时间:2026-09-21 01:39:42 来源:亿速云 阅读:92 作者:小樊 栏目:数据库

删除无用索引是数据库性能优化的重要环节。无用索引会占用存储空间、降低写入(INSERT/UPDATE/DELETE)性能,并增加维护成本。以下是通用方法和主流数据库(MySQL、PostgreSQL、Oracle、SQL Server)的具体操作指南。


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

在删除之前,必须先确认索引确实没被使用:

  1. 查看索引使用统计

    • MySQL:sys.schema_unused_indexesperformance_schema.table_io_waits_summary_by_index_usage
    • PostgreSQL:pg_stat_user_indexesidx_scan = 0
    • Oracle:V$OBJECT_USAGE 或 AWR 报告
    • SQL Server:sys.dm_db_index_usage_statsuser_seeks + user_scans + user_lookups = 0
  2. 观察周期

    • 至少观察一个完整业务周期(如 1~2 周),避免误删周期性使用的索引。
  3. 排除特殊索引

    • 主键、唯一约束索引
    • 外键索引(可能影响关联性能)
    • 刚刚新建、尚未被查询触发的索引

二、各数据库删除方法

1. MySQL

-- 查看未使用索引
SELECT * FROM sys.schema_unused_indexes;

-- 删除索引
ALTER TABLE 表名 DROP INDEX 索引名;
-- 或
DROP INDEX 索引名 ON 表名;

2. PostgreSQL

-- 查看索引扫描次数
SELECT indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0;

-- 删除索引
DROP INDEX 索引名;

3. Oracle

-- 开启监控
ALTER INDEX 索引名 MONITORING USAGE;

-- 查看是否使用
SELECT * FROM V$OBJECT_USAGE;

-- 删除索引
DROP INDEX 索引名;

4. SQL Server

-- 查看使用统计
SELECT *
FROM sys.dm_db_index_usage_stats
WHERE object_id = OBJECT_ID('表名');

-- 删除索引
DROP INDEX 索引名 ON 表名;

三、安全删除建议

  1. 先禁用而非直接删除

    • SQL Server:ALTER INDEX ... DISABLE
    • Oracle:设为 UNUSABLE
    • 观察一段时间后再真正删除
  2. 在低峰期操作

    • 大表删索引也可能锁表(取决于数据库版本)
  3. 备份与记录

    • 记录被删索引的创建语句,方便回滚
    SHOW CREATE TABLE 表名;  -- MySQL
    
  4. 自动化工具

    • MySQL:pt-index-usage(Percona Toolkit)
    • PostgreSQL:pg_stat_statements + 分析工具

四、示例流程(推荐)

  1. 统计索引使用率(≥2周)
  2. 列出 使用次数 = 0 且非关键索引
  3. 在测试环境验证
  4. 生产环境低峰期删除
  5. 持续监控查询性能

如果你能提供具体数据库类型和版本,我可以给你更精确的命令和注意事项。

向AI问一下细节

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

AI