tanqr
2026 年1 月 7 日 16:06
#1
问题背景
https://open.oceanbase.com/course/detail/10665
索引使用的建议
索引修改流程为:新建索引时,必须确认新索引创建完成(即新索引已经生效),并确保旧索引不 会被使用后,再删除旧索引。
by the way: 这条建议,有点儿像高考前建议大家带好准考证。虽然看似简单且容易理解,但是 在蚂蚁集团内部,每年都会有个别同学在新索引还没建好时,就把旧索引给删了,然后造成支付宝 在某个业务上一段时间处于不可用状态,产生大量资损,最后不得不处罚几个DBA 来平息民愤。 希望各位 OceanBase 社区版的用户,在创建索引时,千万不要犯这个低级且可能会产生重大影响 的错误!
建议
蚂蚁使用OB最久,管理最规范,既然这个问题在蚂蚁都无法杜绝,是不是可以在产品层面优化一下。建议如下:
增加安全删除索引语法 ,比如,alter table tab_name drop index index_name safe ; 在执行后,数据库会自行查找dba_index_usage来判断是否可以安全删除 ,当然安全的标准阈值,也可以有配套的参数来控制。
在满足以上功能后,增加参数控制是否禁止无safe的索引删除SQL。 比如SQL,无safe时,直接禁止执行。
在OCP上增加索引使用情况的巡检页。
增加租房、用户未使用索引数量超阈值的告警。提醒DBA删除无用索引。
2 个赞
o大河马
2026 年1 月 8 日 09:18
#2
这种控制不了吧,你加的新索引和老索引都不是一个名,他怎么知道不允许删除哪个索引。很奇怪吧。
还有他在新建索引中,也根本删不掉老的索引,因为有锁,即使不报错后面执行也是顺序先加在删的。
正常操作索引正常的都是先加,(如果有隐藏可以隐藏),最后在删。
如果ddl能加索引的时候指定删除索引,反而这种好吧,比如:
alter table tab_name add index idx_xxx(col1,col2) , drop index index_name;
但是如果在这个语句之前先执行删索引还是不行。 出问题的基本都是这种场景吧,这种还是看人或者流程卡控吧。大部分这种执行都是开发提交的先删后加,正常dba优化sql不会这样操作。
增加监控使用率,也只是一段时间,对于月度年度使用的索引,一段时间时间监控不到也不代表他不使用。只是供DBA参考。
tanqr
2026 年1 月 8 日 09:22
#3
o大河马:
他怎么知道不允许删除哪个索引
基于dba_index_usage判断,比如近7天有使用记录的索引就不可以删除,执行会报错,如果没有使用,则正常执行完成
tanqr
2026 年1 月 8 日 09:23
#4
解决的是误删当前在用索引的问题,有是否新建索引没关系。
tanqr
2026 年1 月 8 日 09:27
#5
您的说法是对的,现在大家也都是这么做的。但是问题的,有的人可能会“不正常操作”,而且不正常操作这个事即使在蚂蚁也没有杜绝掉。
现在是否正常操作取决于人,没系统卡控。
我的需求要解决的是即使人为的"不正常操作"了,也能够阻止
o大河马
2026 年1 月 8 日 09:56
#7
正常没人会专门删除索引,他的场景是先删在加的场景出问题的,如果本身没有索引出问题那是另外的场景。
优化sql,他是必须要删除索引,即使你有使用,也要删除的,就比如他这种异常的先删在加的,正常步骤就是要先加在删,他还是要删。
不用回我了,谢谢。