阿里巴巴数据库分库分表的实践(3)

简介: 阿里巴巴数据库分库分表的实践(3)

此时就出现了我们所说的全表扫描。此时我们来解释一下这里“事务边界”的定义,所谓的事务边界即是指单个SQL语句在后端数据库上同时执行的数量,上面示例中就是事务边界大的典型示例,即一条SQL语句同时被推送到后端所有数据库中运行。事务边界的数量越大,会给系统带来以下弊端:


系统的锁冲突概率越高。如果事务边界大的SQL请求比较多,在一次SQL请求处理过程中自然对于后端的数据库操作的数据库记录覆盖比较广,当有多个类似的SQL请求并行执行时,则出现数据锁造成的资源访问互斥的概率会大大增加。


系统越难以扩展。如果有大量的SQL请求都是这样全表扫描,或者从极端角度说明这个问题,如果每一次的SQL请求都需要全表扫描执行,你会发现整个平台的数据库连接数量是取决于后端单个数据库的连接能力,也就意味着整个数据库的能力是无法通过增加后端数据库实例来扩展的。所以如果有大量的全表扫描的SQL请求对于系统的扩展能力会带来不小的


影响。


整体性能越低。对于性能,这里想强调的是对系统整体性能的影响,而不是单次SQL的性能。应用发送获取买家test1订单列表SQL的请求(如


5-8步骤)时,分布式数据层会并行的将这条SQL语句推送(如图5-8步骤)到后端8台数据库上运行,因为订单数据进行了平均的拆分,单个数据库订单表的数据量大小都使得数据库处于最佳性能表现的状态,所以意味着每一个数据库返回的计算结果都是在一个可期望的时间内(比如100毫秒),将结果返回到分布式数据层(如图5-8步骤),分布式数据层将从各个数据库返回来的结果在内存中进行聚合或排序等操作(如图5-8步骤),最后返回订单列表给应用(如图5-8步骤)。


image.png


5-8DRDS对需全表扫描操作的SQL请求处理流程


整个SQL执行的过程包含了5个步骤,仔细看看,你会发现一次带分库分表键执行的SQL过程也会经历这5个步骤,区别只是在②③步骤是并行的方式同时跟多个后端数据库进行交互,但在时间上带来的影响几乎是毫秒级的;而第个步骤是可能造成差异的一个点,如果像示例中一个用户的订单信息可能最多几千条,对于几千条数据的内存聚合操作,处理时间也是毫秒级的,所以这样一次全表扫描的操作,用户的体验是完全无感知的,跟访问单机数据库的体验是没有差异的。但如果在第个步骤中确实遇到对大数据量(比如几十万、几百万条数据)的聚合、排序、分组等计算时,则会占用较大的内存和CPU计算资源,如果这样类型的SQL请求比较频繁的话,就会给分布式数据层带来较大的资源占用,从而导致整体分布式服务的处理性能受到影响。


很多人对于全表扫描会有一些误解,甚至认为出现全表扫描对于系统来说是完全不能接受的。其实全表扫描在真实的业务场景中很难完全避免(也可以做到完全避免,但会带来其他方面的问题,后面会有说明),对于在分布式数据层的内存中进行数据量不大的聚合这类的SQL请求,如果不是高并发同时请求的情况下,比如对订单进行复杂的条件检索,如图5-9所示,就一定需要采用全表扫描的方式,将查询语句同时推送到后端的数据库中才能实现该场景的要求,但因为调用不会特别频繁,而且计算的数据量不会太大,所以整体不会给数据库整体性能带来太大的影响。


image.png


5-9 订单搜索是典型的多条件查询场景如果是高并发情况下同时请求的话,为了数据库整体的扩展能力,则要考虑下面描述的异构索引手段来避免这样的情况发生。对于在内存中要进行大数据量聚合操作和计算的SQL请求,如果这类SQL的不是大量并发或频繁调用的话,平台本身的性能影响也不会太大,如果这类SQL请求有并发或频繁访问的要求,则要考虑采用其他的平台来满足这一类场景的要求,比如Hadoop这类做大数据量离线分析的产品,如果应用对请求的实时性要求比较高,则可采用如内存数据库或HBase这类平台,这一部分的内容不在本书中讨论。


4.异构索引表尽量降低全表扫描频率


还是基于订单数据的分库分表场景,按照订单ID取模虽然很好地满足了订单数据均匀地保存在后端数据库中,但在买家查看自己订单的业务场景中,就出现了全表扫描的情况,而且买家查看自己订单的请求是非常频繁的,必然给数据库带来扩展或性能的问题,有违尽量减少事务边界这一原则。其实这类场景还有很多,比如卖家要查看与自己店铺相关的订单信息,同样也会出现上述所说的大量进行全表扫描的SQL请求。


针对这类场景问题,最常用的是采用“异构索引表”的方式解决,即采用异步机制将原表内的每一次创建或更新,都换另一个维度保存一份完整的数据表或索引表。本质上这是互联网公司很多时候都采用的一个解决思路:“拿空间换时间”。


也就是应用在创建或更新一条按照订单ID为分库分表键的订单数据时,也会再保存一份按照买家ID为分库分表键的订单索引数据,如图5-10所示,其结果就是同一买家的所有订单索引表都保存在同一数据库中,这就是给订单创建了异构索引表。


image.png


5-10 订单异构索引表

相关文章
|
2月前
|
人工智能 运维 关系型数据库
云栖大会|AI时代的数据库变革升级与实践:Data+AI驱动企业智能新范式
2025云栖大会“AI时代的数据库变革”专场,阿里云瑶池联合B站、小鹏、NVIDIA等分享Data+AI融合实践,发布PolarDB湖库一体化、ApsaraDB Agent等创新成果,全面展现数据库在多模态、智能体、具身智能等场景的技术演进与落地。
|
2月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
3月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
213 8
|
9月前
|
人工智能 前端开发 JavaScript
代码采纳率从 22% 到 33%,通义灵码辅助数据库智能编码实践
通义灵码本质上是一个AI agent,它已经进行了大量的优化。然而,为了更完美或有效地调用模型的潜在能力,我们在使用时仍需掌握一些技巧。通常,大多数人在使用通义灵码时会直接上手,这是 AI agent 的一个优势,即 zero shot 使用,无需任何上下文即可直接使用通义灵码的能力。
|
5月前
|
人工智能 运维 数据挖掘
瑶池数据库Data+AI驱动的全栈智能实践开放日回顾
阿里云瑶池数据库重磅推出“Data+AI能力家族”,包括DTS AI数据准备、Data Agent系列智能体及DMS MCP统一数据访问服务,重构数据与AI协同边界。通过智能化工具链,覆盖数据全生命周期,提升企业数据开发、分析、治理与运维效率,降低技术门槛,激活数据资产价值,助力企业迈向全栈智能新时代。
|
6月前
|
人工智能 运维 数据挖掘
瑶池数据库开放日:全新发布Data+AI能力家族,赋能企业全栈智能实践
近日,阿里云瑶池数据库生态工具产品重磅升级,推出“Data+AI能力家族”,并举办了为期3天的全栈智能实践开放日活动。发布会上首次公开了 “Data Agent for Analytics、Data Agent for Meta、DAS Agent”等瑶池数据库Data Agent系列能力,以工具智能化 × 智能化工具的双引擎重构数据与AI的协同边界,揭秘AI时代数据价值释放的全新路径。
|
11月前
|
关系型数据库 OLAP API
非“典型”向量数据库AnalyticDB PostgreSQL及RAG服务实践
本文介绍了非“典型”向量数据库AnalyticDB PostgreSQL及其RAG(检索增强生成)服务的实践应用。 AnalyticDB PostgreSQL不仅具备强大的数据分析能力,还支持向量查询、全文检索和结构化查询的融合,帮助企业高效构建和管理知识库。
646 19
|
9月前
|
数据库
|
11月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
298 11
|
弹性计算 安全 关系型数据库
活动实践 | 自建数据库迁移到云数据库
通过阿里云RDS,用户可获得稳定、安全的企业级数据库服务,无需担心数据库管理与维护。该方案使用RDS确保数据库的可靠性、可用性和安全性,结合ECS和DTS服务,实现自建数据库平滑迁移到云端,支持WordPress等应用的快速部署与运行。通过一键部署模板,用户能迅速搭建ECS和RDS实例,完成数据迁移及应用上线,显著提升业务灵活性和效率。

热门文章

最新文章