惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
J
Java Code Geeks
A
About on SuperTechFans
F
Fortinet All Blogs
B
Blog
aimingoo的专栏
aimingoo的专栏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
博客园_首页
博客园 - 叶小钗
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
云风的 BLOG
云风的 BLOG

Pil0tXia

撒下种子,然后不期而遇 —— 在 CommunityOverCode Asia 2024 与热爱重逢 Apache EventMesh vs. AWS EventBridge: “产品化” 是开源中间件的出路吗? 《铃芽之旅》4K SDR madVR 渲染壁纸 成为 Apache Committer 只是我投身开源社区建设的开始 Apache 社区力量的汇聚 & 程序员奔现大会:CommunityOverCode Asia 2023 给我的成长 【开源贡献笔记】异步文件事件监听:协调稳健的 Webhook 配置缓存同步 【联想实习笔记】克服在流中使用 Lambda 表达式排序时编译器类型推断的弱点 【开源贡献笔记】前辈在单元测试里留下的 TODO 注释,你该信吗? 【开源之夏】DataSphereStudio 集成 GitLab 课题 Proposal(已中选) 【开源之夏】Apache EventMesh 整合 admin 模块课题 Proposal(已中选) 【开源贡献笔记】确保线程在阻塞状态被中断的 InterruptedException 得到处理 【联想实习笔记】如何优雅地处理数据表中一对多的重复记录 编译原理学习笔记 【联想实习笔记】软件开发的流程和规范 《你的名字。》 2K SDR 4K 原盘超采样壁纸 《铃芽之旅》是新海诚对粉丝的背叛吗?不,是他对自己的忠实。 www 域名前缀过时了吗?你需要知道的一切 基于不蒜子 2.3 自定义站点访问量 (site_pv, site_uv, page_pv) Linux 后台程序的创建与管理
【联想实习笔记】分步查询真的一定比联表查询更好吗?
Pil0tXia · 2023-06-02 · via Pil0tXia

虽然分步查询代码可复用性高、更利于后续的维护、可以更好的利用缓存,但是阿里规范禁止三张表 JOIN 的最迫不得已的原因为:

  • 去 IOE 行动后,MySQL 优化器和执行器很弱,多表连接性能不如 Oracle
  • 单表在 MySQL 中数据量太大,由于它的索引结构设计没有针对大表,所以查询性能会断崖式下滑
  • 不得不考虑分库分表 + 中间件的模型,但跨库 JOIN 的性能受网络 IO 瓶颈,除非业务能够很好的根据 sharding key 明确要 Join 的两个表在同一个物理库中
  • 如果将 Join 放到中间件去实现,由于中间件拿到数据 sharding 信息更难,成本肯定更大
  • 中间件一般对跨库 join 都支持不好。在分库分表中,要同步更新两个表,这两个表位于不同的物理库中,为了保证数据一致性,一种做法是通过分布式事务中间件将两个更新操作放到一个事务中,但这样的操作一般要加全局锁,性能很捉急,而有些业务能够容忍短暂的数据不一致,怎么做?让它们分别更新呗,但是会存在数据写失败的问题,那就起个定时任务,扫描下 A 表有没有失败的行,然后看看 B 表是不是也没写成功,然后对这两条关联记录做订正,这个时候同样没法用 join 去实现,只能将数据拉到 service 层应用自己来合并了

这些规则都是互联网开发团队总结出来的,适用于高并发、轻写重读、分布式、业务逻辑简单的情况,甚至对数据的一致性要求都不高,允许脏读(毕竟 web 是个非实时、无状态的东西)。

而对于很多低并发、频繁复杂数据写入、CPU 密集而非 IO 密集、主要业务逻辑通过数据库处理、甚至包含大量存储过程、对一致性与完整性要求很高的系统。比如金融、财务、企业应用之类,复杂 Join 也是不可避免的,不仅要写,还要写好,才能发挥数据库最大的功用。

在我的 Team 中,有很多 DB 同事,为 Java 开发写好了 SAP HANA 数据库的存储过程,进行了大量数据清洗,理应利用高效的内存数据库优势。此外,由于 SCI 系统的内存资源比较紧张,一个微服务在容器云上目前最多只能分配 10G,同时业务表数据量比较巨大,一个 version 几千万的数据是很正常的,如果分步查询,每个步骤的获取的结果都需要拿到 JVM 内存中与下一步的结果去做处理,会比较占用内存。因此很多报表的处理思路都是能在 SQL 中解决的就在 SQL 中解决,Java 代码中不做复杂的逻辑。