暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Automatic Indexing

原创 张超 2026-03-30
26

Automatic Indexing(自动索引) 是数据库自治优化的核心能力,能自动分析负载、创建 / 重建 / 删除索引,大幅降低 DBA 运维成本并持续提升查询性能。以下从核心概念、工作流程、创建 / 删除机制、主流实现与配置、优缺点展开详细介绍。




一、核心概念


Automatic Indexing 是数据库内置的智能索引管理系统,通过后台进程周期性分析 SQL 负载、表统计信息,自动完成索引的创建、验证、启用、监控、重建与清理,无需人工干预。


  • 核心目标:消除索引冗余、补全缺失索引、减少锁表与维护开销,让数据库 “自我调优”。
  • 典型场景:OLTP/OLAP 混合负载、业务 SQL 频繁变化、DBA 人力不足的云 / 自治数据库环境。




二、完整工作流程(以 Oracle 19c 为例)


自动索引进程(Auto Index Process)默认每 15 分钟在后台执行一次,流程如下:


  1. 捕获与分析(Capture)
    • 收集 SQL 历史、执行计划、绑定变量、表统计信息,识别高频 / 慢查询与过滤列。
    • 仅对统计信息最新的表生成候选索引。
  2. 候选索引生成(Identify Candidates)
    • 基于查询模式推荐单列 / 组合索引,命名以SYS_AI_开头。
    • 支持分区表、虚拟列、JSON 表达式等复杂场景。
  3. 静默创建(Invisible Creation)
    • 先创建不可见(Invisible)索引,优化器默认不使用,不影响现有业务。
  4. 性能验证(Verify)
    • 用不可见索引测试 SQL 性能,对比原执行计划的耗时、IO、CPU。
    • 性能显著提升 → 转为可见(Visible);无提升 → 标记为不可用(Unusable)
  5. 监控与维护(Monitor & Rebuild)
    • 持续跟踪索引使用频率,重建因表维护(如ALTER TABLE MOVE)失效的索引。
  6. 自动清理(Drop)
    • 定期扫描未使用索引,达到保留期后自动删除,释放存储。




三、自动创建机制


1. 触发条件


  • 高频查询缺少有效索引、全表扫描占比过高、响应时间超时。
  • 表统计信息更新后,负载模式发生显著变化。


2. 安全策略(避免风险)


  • 先不可见、后验证:确保新索引不破坏现有 SQL 稳定性。
  • Online DDL:创建 / 重建不锁表(如 MySQL / 阿里云 DAS)。
  • 可回滚:性能退化时自动禁用并生成 SQL 计划基线。


3. 索引类型


  • 主流:B-Tree(通用)、Bitmap(低基数列)、函数 / 表达式索引。
  • 特殊:向量索引(HNSW)、地理索引(BKD)、全文倒排索引(如 CrateDB)。




四、自动删除机制


1. 删除对象


  • 自动索引(Auto Indexes):系统创建、长期未使用的索引。
  • 手动索引(Manual Indexes):可配置是否自动清理(默认不删)。


2. 保留期(Retention)


  • Oracle 默认:自动索引373 天、手动索引不自动删
  • 可通过参数调整:

    sql

    -- 自动索引保留60天
    EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_AUTO', '60');
    -- 手动索引保留90天
    EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_RETENTION_FOR_MANUAL', '90');
    




3. 删除逻辑


  • 索引连续 N 天未被优化器使用 → 标记为待删除。
  • 保留期到期 → 后台自动DROP,不可手动删除(Oracle)。
  • 重建不可用索引,而非直接删除。




五、主流数据库实现与配置


1. Oracle 19c+(自治数据库原生支持)


  • 模式
    • OFF:关闭。
    • REPORT ONLY:仅生成报告、创建不可见索引、不启用。
    • IMPLEMENT:自动创建并启用可见索引。
  • 开启命令:

    sql

    EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
    




2. 阿里云 DAS(MySQL/PostgreSQL)


  • 开启路径:自治中心 → 自治功能 → 勾选自动索引创建 / 删除
  • 执行窗口:仅在可维护时间窗执行,避免业务高峰。


3. PostgreSQL(插件)


  • hypopg:模拟索引、生成推荐,不自动创建。
  • pg_auto_index:第三方扩展,实现自动创建 / 删除。


4. CrateDB(全文 / 向量数据库)


  • 插入时自动为所有字段建索引(倒排 / BKD/HNSW),查询透明使用。




六、优缺点对比


表格

优点缺点
降低 DBA 索引调优工作量初期需配置保留期、模式等参数
随负载动态优化,避免索引过时极端复杂 SQL 可能推荐不合理索引
自动清理冗余,节省存储自动索引不可手动删(Oracle),需等待保留期
在线创建 / 重建,业务无感知部分数据库仅云 / Exadata 支持
提供报告,便于审计与排查首次执行的 SQL 无法立即使用自动索引




七、适用场景与最佳实践


1. 推荐使用


  • 云数据库 / 自治数据库(如 Oracle ATP、阿里云 RDS)。
  • 业务迭代快、SQL 变化频繁的 OLTP 系统。
  • 缺乏专职 DBA 的中小团队。


2. 最佳实践


  • 先在REPORT ONLY模式观察 1–2 周,确认推荐合理再启用IMPLEMENT
  • 合理设置保留期:自动索引 30–90 天、手动索引不自动删。
  • 定期查看自动索引报告,监控性能变化。
  • 关键业务 SQL 仍建议人工审核与固定执行计划。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论