Hive中按eventId检索指定事件的最优实现方式咨询
优化Hive按eventId查询事件的方案
当前先拉取全部事件再用firstWhere筛选的方式并非最优,当事件数量较多时,会额外加载大量不必要的数据,拖慢查询速度且占用更多内存。
更优方案:用eventId作为Hive存储的Key
Hive本质是键值对数据库,直接将eventId作为存储的key,事件对象作为value,就能实现O(1)时间复杂度的直接查询,无需遍历全部数据。
存储时的代码调整:
// 将事件以eventId为key存入Hive的box await Hive.box('events').put(event.eventId, event);
查询时的代码:
// 直接通过eventId获取目标事件 var ev = Hive.box('events').get(8);
若无法修改现有存储结构
如果因为历史原因必须保留列表形式的存储(比如所有事件存在一个List里,存在某个固定key下),那当前的firstWhere写法是可行的,但只适合数据量较小的场景。这种情况下可以考虑在初始化时提前构建一个Map<int, Event>的索引缓存,后续查询直接从缓存取:
// 初始化时构建缓存 Map<int, Event> eventCache = { for (var event in HiveEvents.getAllEvents()) event.eventId: event }; // 后续查询直接用缓存 var ev = eventCache[8];
内容的提问来源于stack exchange,提问作者StripyTiger
相关产品推荐
相关产品推荐

