当前位置: 首页 > news >正文

跨数据源搜索的优化过程

问题背景

做一个数据库表查看、标注与分析的功能。

\(Table\)是数据库1中的表的信息(information_schema.tables);\(Documentation\)\(Table\)的数据字典文档,存储在本地文件中;\(Annotation\)是对\(Table\)的额外标注信息,存储在数据库2中。每一条\(Table\),最多关联到一条\(Documentation\)和一条\(Annotation\)

现在想搜索\(Table\)。前端向后端提供3个参数,搜索关键词列表、当前页码、每页条数;后端的搜索逻辑是,如果一条完整数据(\(Table\)+\(Documentation\)+\(Annotation\))包含所有搜索关键词,则将\(Table\)加入搜索结果中。

\(Table\)的数量目前为6000+,要做到秒级搜索。

第一版实现

因为跨数据源,所以不能简单连表查询。

对于每个\(Table\),查出\(Documentation\)\(Annotation\),然后将\(Table\)\(Documentation\)\(Annotation\)中要搜索的字段值取出来,用空格隔开拼接为字符串,形如"Table字段值 Documentation字段值 Annotation字段值",我们称之为\(SearchKey\)(搜索键)。如果每个关键词都包含在\(SearchKey\)中,则将\(Table\)加入搜索结果。

搜索时,先获取所有\(Table\),然后遍历每个\(Table\),获取\(SearchKey\)并判断是否加入搜索结果。

为了提高速度,用Redis缓存\(Table\)对应的\(SearchKey\)

分析数据情况:

  • \(Table\)只增、不删、不改,因此,搜索时要重新获取所有\(Table\),确保搜索到新\(Table\);不必考虑驱逐(evict)\(SearchKey\)的缓存。
  • \(Documentation\)不增、不删、不改,因此,不必考虑驱逐\(SearchKey\)的缓存。
  • \(Annotation\)增、删、改,因此,要在\(Annotation\)增、删、改之后建立、驱逐对应\(SearchKey\)的缓存,确保搜索到\(Annotation\)的最新信息。

实测结果:

  • 实现了功能,支持同时按\(Table\)\(Documentation\)\(Annotation\)的字段搜索。
  • 有性能问题,即使缓存已经全部完成,但每次搜索都要耗时30s左右,原因是6000+个\(Table\)遍历从Redis获取\(SearchKey\),每次耗时1~15ms,累计耗时长。

第二版实现

优化缓存策略。

获取所有\(Table\)后,构建\(SearchKeyMap\)\(Table\)\(SearchKey\)),然后将\(SearchKeyMap\)缓存,这样,下一次搜索时,只需要从Redis获取一次,提高传输效率。

为了确保搜索到新\(Table\),缓存\(SearchKeyMap\)时将\(Table\)列表的长度作为缓存键,如果新增了\(Table\),则\(SearchKeyMap\)不会命中缓存,会重新构建。

为了减少构建\(SearchKeyMap\)的时间,仍然保留单个\(SearchKey\)的缓存,仍然在\(Annotation\)增、删、改之后建立、驱逐单个\(SearchKey\)的缓存,但不同的是,还要同时驱逐\(SearchKeyMap\)的缓存。

实测结果:

  • 性能提升明显,在缓存全部完成的情况下,搜索耗时降至1.3s。
  • 仍然有性能问题,对一个\(Annotation\)做了增、删、改,会驱逐整个\(SearchKeyMap\)缓存,重建\(SearchKeyMap\)就又回到了遍历\(Table\)的情况,耗时30s左右。
http://www.gsyq.cn/news/154126.html

相关文章:

  • 三星自研GPU剑指AI芯片霸权,2027年能否撼动英伟达?
  • 高速斩拌机厂家综合实力排行,国内有实力的搅拌机品牌怎么选择博锐满足多元需求 - 品牌推荐师
  • DeepAnaX「GEO优化分析统计系统」重磅升级:让每一份数据都通往清晰决策
  • 2025最新!研究生必备8个AI论文工具:开题报告与文献综述全测评
  • 同步通信协议(I2C协议、SPI协议、驱动OLED/EEPROM/传感器)教程,文章内容利于搜索引擎搜索,整篇文章不要有AI生成痕迹
  • 怎么渡过骑行倦怠期?
  • 学长亲荐10个AI论文平台,自考毕业论文轻松搞定!
  • Aneiang.Pa 代理池(Proxy Pool)功能与 ASP.NET Core Web API 集成实战
  • 2025终极AI论文神器:9款免费工具实测,查重<13%原创度高超靠谱!
  • 2026年AI产品经理进化论:当“业务直觉”遭遇“技术理性”
  • 碎点
  • Transformer 模型读书报告
  • AI创业心得:录视频量产技巧+广告行业价格战痛点分享
  • Centos搭建LDAP 目录服务
  • http复习2
  • 飞剪追剪程序plc程序伺服程序 同步控制 适合新手学习参考 包含PLC程序+触摸屏程序+CAD...
  • 下一阶段的技术与生态:多模态、生成式与人机协作的“新均衡”
  • Java反射:解锁框架开发的终极密码,让代码拥有“动态灵魂“!!
  • 最小二乘支持向量机(LSSVM)结合遗传算法(GA)解决单目标优化问题,MATLAB代码
  • 国产数据库:从替代到引领,重塑数字经济核心底座
  • YOLOv11 改进 - C2PSA | C2PSA融合TSSA(Token Statistics Self-Attention)令牌统计自注意力,优化遮挡目标感知
  • (35)使用Spring的AOP
  • 基于PSO-GA混合算法的施工进度计划多目标优化,以最小化总成本并实现资源均衡,满足工期约束和资源限制,MATLAB代码
  • Spring 7.0 与 Spring AI:Java 生态在 AI 时代的“绝对利器”
  • 微信小程序vue_uniapp研究生导师日常交互师生交流,考勤打卡任务,请假
  • BMI160六轴惯性运动传感器原理图设计,已量产(加速度传感器)
  • 2025最新!专科生必看!8个AI论文平台测评,写毕业论文不再难
  • BMM350三轴地磁传感器原理图设计,已量产(加速度传感器)
  • PCIe-Tag字段与Outstanding Request
  • 实用指南:Redis底层数据结构 -- ziplist, quicklist, skiplist