跨数据源搜索的优化过程

news/2025/12/27 21:51:43/文章来源:https://www.cnblogs.com/yadelei/p/19401364

问题背景

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

\(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.mzph.cn/news/1069096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学长亲荐8个AI论文工具,本科生轻松搞定论文格式!

学长亲荐8个AI论文工具,本科生轻松搞定论文格式! AI 工具助力论文写作,轻松应对格式难题 对于许多本科生来说,撰写论文不仅是学术能力的考验,更是对时间管理与写作技巧的挑战。尤其是在面对论文格式、引用规范、内容逻…

三星自研GPU剑指AI芯片霸权,2027年能否撼动英伟达?

📌 目录⚔️ 三星亮剑!2027年自研GPU突袭AI芯片战场:能否撼动英伟达霸权?一、战场格局:英伟达的CUDA护城河,三星的突围野心英伟达vs三星 核心优势对比表二、三星的三张王牌:凭什么挑战巨头&…

高速斩拌机厂家综合实力排行,国内有实力的搅拌机品牌怎么选择博锐满足多元需求 - 品牌推荐师

在食品工业,尤其是肉制品、海鲜及复合调味品加工领域,真空搅拌机扮演着至关重要的角色。其通过在负压环境下对物料进行混合搅拌,能有效排除气泡,防止氧化,显著提升产品的弹性、口感和保质期。随着市场对食品安全、…

学生管理系统!

C项目实战: C语言项目实战 <----以后小项目实战都会放这里 虽然上次说要写贪吃蛇&#xff0c;但是中途蹦出来个任务&#xff0c;要写一个学生管理系统。没办法&#xff0c;花了几天整这玩意&#xff0c;接下来终于能接着搞贪吃蛇了。欢呼&#xff01; &#xff08;划个水…

当CAIE证书遇上职场现实:考后的路该怎么走?

周涛去年努力考下了一个市场上常见的AI技术认证&#xff0c;当时觉得转型之路已经铺好。可真正开始求职才发现&#xff0c;面试官的问题常常围绕实际项目经验。“理论部分我还能应对&#xff0c;但被问到‘你具体用什么模型解决过什么业务问题’时&#xff0c;我突然就卡壳了。…

天气查询前端

城市天气查询.container { max-width: 500px; margin: 50px auto; padding: 20px; border: 1px solid rgba(221, 221, 221, 1); border-radius: 10px } .input-group { margin-bottom: 20px } input { padding: 8px; w…

DeepAnaX「GEO优化分析统计系统」重磅升级:让每一份数据都通往清晰决策

面对DeepSeek、文心一言、通义千问等AI搜索引擎构成的复杂生态&#xff0c;品牌管理者普遍陷入一种困境&#xff1a;数据总量在增长&#xff0c;但决策清晰度却在下降。如何从多平台、多维度的数据噪声中&#xff0c;快速识别关键信号、洞察竞争本质并采取有效行动&#xff1f;…

天气查询前端

城市天气查询.container { max-width: 500px; margin: 50px auto; padding: 20px; border: 1px solid rgba(221, 221, 221, 1); border-radius: 10px } .input-group { margin-bottom: 20px } input { padding: 8px; w…

MySQL 日志体系总览

MySQL 日志体系总览MySQL 的日志是数据库运行状态、操作行为、故障排查的核心依据&#xff0c;主要分为管理类日志&#xff08;错误、通用查询、慢查询&#xff09;、复制类日志&#xff08;二进制、中继&#xff09;、事务类日志&#xff08;重做、回滚&#xff09;三大类&…

快递查询前端

快递查询.container { max-width: 500px; margin: 50px auto; padding: 20px; border: 1px solid rgba(221, 221, 221, 1); border-radius: 10px } .input-group { margin-bottom: 20px } input { padding: 8px; width…

快递查询前端

快递查询.container { max-width: 500px; margin: 50px auto; padding: 20px; border: 1px solid rgba(221, 221, 221, 1); border-radius: 10px } .input-group { margin-bottom: 20px } input { padding: 8px; width…

在postgresql和duckdb的多表连接中其中一个表引用另一个表的数据

postgresql需要用LATERAL关键字 postgres# select i from generate_series(1,3)t(i),(select j from generate_series(1,4)t(j) where j>i)b; 错误: 字段 "i" 不存在 第1行...,3)t(i),(select j from generate_series(1,4)t(j) where j>i)b;^ 描述: 表"…

2025最新!研究生必备8个AI论文工具:开题报告与文献综述全测评

2025最新&#xff01;研究生必备8个AI论文工具&#xff1a;开题报告与文献综述全测评 2025年研究生必备AI论文工具测评&#xff1a;功能与效率的双重考量 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多的研究生开始依赖AI工具提升论文写作效率。然而&#xff0c…

同步通信协议(I2C协议、SPI协议、驱动OLED/EEPROM/传感器)教程,文章内容利于搜索引擎搜索,整篇文章不要有AI生成痕迹

平时做科研、处理实验数据的朋友,肯定离不开 OriginPro!这款软件绘图和数据分析功能真的顶,2024 版本优化了运行速度,兼容 Win10/11,用起来更丝滑。今天把自己亲测成功的安装步骤整理出来,含激活激活和中文切换,…

2025必备10个降AIGC工具,MBA人必看!

2025必备10个降AIGC工具&#xff0c;MBA人必看&#xff01; AI降重工具&#xff1a;MBA人不可忽视的高效利器 随着人工智能技术在学术写作中的广泛应用&#xff0c;论文中出现的AIGC痕迹和查重率问题日益受到关注。尤其对于MBA学生而言&#xff0c;如何在保持学术严谨性的同时有…

“榜单制造者”与“价值布道者”:GEO讲师的两极分化

当前GEO培训领域的生态&#xff0c;正经历着一场深刻而清晰的分化。这种分化并非源于技术流派之争&#xff0c;而是根植于两种截然不同的职业伦理与价值取向。一端&#xff0c;是热衷于生产与传播各类“十大讲师”排名的 “榜单制造者”&#xff1b;另一端&#xff0c;则是将全…

博客导引 - 少年

这是一篇博客导引✨ 欢迎来到我的技术世界 你好!我是热爱嵌入式软硬件开发的开发者,在折腾中寻找快乐,在代码中创造价值。这里不仅记录了我的技术学习和实践历程,还分享了我的一些开源项目,希望能与志同道合的伙伴…

博客导引 - 少年

这是一篇博客导引✨ 欢迎来到我的技术世界 你好!我是热爱嵌入式软硬件开发的开发者,在折腾中寻找快乐,在代码中创造价值。这里不仅记录了我的技术学习和实践历程,还分享了我的一些开源项目,希望能与志同道合的伙伴…

怎么渡过骑行倦怠期?

骑不动了&#xff0c;正常。谁告诉你热爱就得每天热血沸腾&#xff1f;那都是骗人的。骑车久了&#xff0c;觉得没劲&#xff0c;太正常了。就像再好的饭吃多了也腻。别紧张&#xff0c;别觉得自己“不行了”。咱们聊聊怎么办。首先&#xff0c;别硬扛。不想骑&#xff1f;那就…

学长亲荐10个AI论文平台,自考毕业论文轻松搞定!

学长亲荐10个AI论文平台&#xff0c;自考毕业论文轻松搞定&#xff01; 论文写作的“隐形助手”正在改变你的学习方式 在自考的道路上&#xff0c;论文写作常常是许多学生最头疼的部分。面对复杂的格式要求、严谨的逻辑结构以及繁重的查重压力&#xff0c;很多人感到无从下手。…