You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GridDB CE v5.0时序容器中实现非键列高效二级索引过滤

GridDB CE v5.0 时序容器二级索引创建与高效查询方案

GridDB时序容器默认仅对主键(timestamp)构建索引,非键列的过滤查询默认会触发全表扫描。针对你的业务场景,需手动为deviceId和isCalibrated字段创建二级索引,才能实现高效过滤。

一、创建二级索引

1. 容器初始化时指定索引(推荐)

若容器尚未创建,可在定义Schema阶段直接添加索引配置:

// 定义遥测数据的时序Schema
TimeSeriesSchema schema = TimeSeriesSchema.of(Telemetry.class);
// 为deviceId字段创建二级索引
schema.addIndex("deviceId", IndexType.DEFAULT);
// 为isCalibrated字段创建二级索引
schema.addIndex("isCalibrated", IndexType.DEFAULT);

// 创建时序容器
TimeSeries<Telemetry> ts = gridStore.putTimeSeries("telemetry", schema);

2. 已存在容器动态添加索引

若容器已创建并写入数据,可通过createIndex方法补建索引(建议在业务低峰期执行,避免影响在线业务):

// 获取已存在的时序容器
TimeSeries<Telemetry> ts = gridStore.getTimeSeries("telemetry", Telemetry.class);
// 为deviceId创建索引
ts.createIndex("deviceId", IndexType.DEFAULT);
// 为isCalibrated创建索引
ts.createIndex("isCalibrated", IndexType.DEFAULT);

二、验证索引生效

创建索引后,可通过EXPLAIN语句查看查询计划,确认是否命中索引:

Query<?> explainQuery = ts.query("EXPLAIN SELECT * WHERE deviceId = 'sensor-42' AND isCalibrated = true AND timestamp > TIMESTAMPADD(DAY, -1, NOW())");
RowSet<Row> explainRs = explainQuery.fetch();
while (explainRs.hasNext()) {
    Row row = explainRs.next();
    System.out.println(row.getString(0));
}

输出结果中包含IndexScan则表示索引已生效,若为FullScan则需检查索引创建是否成功。

三、查询语句优化说明

你的原有查询语句无需修改,GridDB会自动利用二级索引组合进行过滤:

Query<Telemetry> query = ts.query(
  "SELECT * WHERE deviceId = 'sensor-42' AND isCalibrated = true AND timestamp > TIMESTAMPADD(DAY, -1, NOW())"
);
RowSet<Telemetry> rs = query.fetch();

注意:避免在索引列上使用自定义函数,GridDB仅对主键timestamp的内置时间函数(如TIMESTAMPADD)有优化支持。

关键注意事项

  • GridDB CE v5.0支持对字符串、布尔、数值类型的非键列创建二级索引,deviceId(String)和isCalibrated(boolean)均符合要求
  • 索引会占用额外存储空间,同时会略微增加数据插入的性能开销,需平衡查询性能与写入性能
  • 若数据量极大,可考虑结合容器分区(按deviceId或时间范围)进一步优化查询效率

内容的提问来源于stack exchange,提问作者Klc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:20:06