作者简介:张程辉,瑞蓝创数据库工程师
原创内容未经授权不得随意使用,转载请联系小编并注明来源
基本信息
OB版本:4.3.5.6-106010042026042914,MySQL租户
做索引治理、清理无用索引的时候,大家都会依赖 DBA_INDEX_USAGE 视图,通过索引访问统计,判断索引还有没有业务在访问。
但很多同学会遇到一个迷惑现象:
✅ SQL 的执行计划明确走了二级索引
❌ 去查 DBA_INDEX_USAGE,结果空空如也,完全没有这条索引的访问记录
这到底是 BUG,还是本身的机制就是如此?下面结合完整复现过程,把原理和避坑方案一次性讲清楚。
问题现场
表cbs_logistics__logistics_kuaidi100_track有索引,为什么执行 SELECT OBJECT_ID, NAME, OWNER, TOTAL_ACCESS_COUNT, TOTAL_EXEC_COUNT, LAST_USED FROM oceanbase.DBA_INDEX_USAGE where name like '%500293%'; 没有任何内容呢 ?

排查过程
查看表结构及索引信息
查看_iut_stat_collection_type值(控制索引监控信息统计的模式)。有以下两种取值可选:
SAMPLED:默认值,表示按采样模式监控索引的使用,采样率为 10%(采样率不可更改)。
ALL:表示全量监控索引表的使用,此模式虽然可以得到准确的结果,但是会有资源开销。
select * from oceanbase.gv$ob_parameters where name like '_iut_stat_collection_type';
完整复现测试
1、创建表
CREATE TABLE `cbs_logistics__logistics_kuaidi100_track` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`kuaidinum` varchar(100) ,
`kuaidicom` varchar(100) ,
`kuaiditime` varchar(100) ,
`ftime` varchar(100) ,
`create_time` datetime ,
PRIMARY KEY (`id`),
KEY `idx_kuaidicom_kuaidinum` (`kuaidinum`, `kuaidicom`) BLOCK_SIZE 16384 LOCAL,
KEY `idx_create_time` (`create_time`, `kuaidinum`) BLOCK_SIZE 16384 LOCAL,
KEY `idx_kuaiditime_kuaidinum` (`kuaiditime`, `kuaidinum`) BLOCK_SIZE 16384 LOCAL
);
插入数据
INSERT INTO `cbs_logistics__logistics_kuaidi100_track`
(`kuaidinum`, `kuaidicom`, `kuaiditime`, `ftime`, `create_time`)
VALUES
('SF1234567890', 'shunfeng', '2026-10-09 10:30:00', '已签收', '2026-10-09 10:30:00'),
('YT9876543210', 'yuantong', '2026-10-09 11:15:00', '运输中', '2026-10-09 11:15:00'),
('ZTO5555666677', 'zhongtong', '2026-10-09 09:45:00', '派送中', '2026-10-09 09:45:00'),
('EMS1122334455', 'ems', '2026-10-08 16:20:00', '已签收', '2026-10-08 16:20:00'),
('JD7788990011', 'jd', '2026-10-09 14:00:00', '待取件', '2026-10-09 14:00:00');
2、执行 select 查询,并确认查询能走索引查询(如:idx_kuaidicom_kuaidinum)
explain select * from cbs_logistics__logistics_kuaidi100_track where kuaidinum='SF1234567890' and kuaidicom='shunfeng';
3、查询索引使用,查看DBA_INDEX_USAGE,未记录索引idx_kuaidicom_kuaidinum
SELECT OBJECT_ID, NAME, OWNER, TOTAL_ACCESS_COUNT, TOTAL_EXEC_COUNT, LAST_USED FROM oceanbase.DBA_INDEX_USAGE;
4、当前索引监控信息统计的模式为默认值SAMPLED,从上面查询结果来看符合预期,该模式下的数据可能会丢,如果需要查询到完整索引信息,就需要设置监控信息统计的模式为ALL
# 1.查看当前索引监控信息统计的模式值
select * from oceanbase.gv$ob_parameters where name like '_iut_stat_collection_type';
# 2.修改当前索引监控信息统计的模式值
# mysql模式
ALTER SYSTEM SET _iut_stat_collection_type='ALL';
# Oracle模式
alter system set "_iut_stat_collection_type"='ALL';
5、重新执行select,后台每隔十几分钟把监控数据刷到磁盘里,再过几分钟查询视图确认结果,可以查出索引idx_kuaidicom_kuaidinum记录信息
核心结论
因为索引监控在集群启动时采用默认的采样(SAMPLED)模式,这种模式下并非所有索引使用数据都会被记录到内部表,视图 DBA_INDEX_USAGE 可能出现查询结果为空的情况。
END
瑞蓝创 OceanBase OBCP V4 精英训练营
点击下方图片立即了解详情


▼ 点击「阅读原文」,了解更多产品技术文章


