分布式 SQL 数据库与表格优化技术

分布式 SQL 数据库会将应用程序数据存储在多个节点上,从存储和计算的角度提高了可扩展性。这种分布意味着某些应用程序请求,包括 JOIN 操作和聚合,可能跨多个数据库节点,可能导致数据在网络中的传输。

为了减轻网络延迟对整体应用程序性能的影响,一些数据库支持共置和交错表格。这种优化技术允许将子表格记录与其父行一起存储。因此,在执行查询时,某些需要查询父子记录的请求可能会更快,因为数据库节点在数据传输过程中的负载较小。

然而,像任何优化技术一样,共置和交错表格也有其优缺点。让我们深入了解这些表格类型,以更好地理解它们的好处和权衡。

定义

共置表格(Colocated Tables)和交错表格(Interleaved Tables)是数据库中的优化技术,用于改善数据存储和查询性能。

共置表格(Colocated Tables)

共置表格是一种优化方法,允许将子表格(child table)的记录与其父表格(parent table)的行一起存储在相同的物理位置或相邻的位置。它通过将相关数据放置在同一节点或相近节点上来提高查询效率,尤其对于需要频繁进行父子表格数据关联的查询来说,可以减少网络传输和提升查询性能。

交错表格(Interleaved Tables)

交错表格是共置表格的一种特殊类型。与共置表格不同的是,交错表格会在同一物理表结构和数据库文件中将子行与其父行物理地相邻存储,而不是分开存储。逻辑上,这些子表格和父表格仍然是不同的表格,但物理上它们的数据行被交错存储,这有助于更快地执行联合查询和减少数据查找的次数。

总的来说,这些优化技术旨在提高数据库查询效率,减少数据传输,特别是针对需要频繁进行父子表格数据关联的查询,通过优化数据存储和组织来改善性能。

共置表格

举个例子: 设想一个虚构公司开发电子商务应用程序,允许各种商家在线销售商品。

该应用程序包括两个关键表格,跟踪 Customers(客户)和他们的 Orders(订单)(注意,颜色用于区分来自不同客户的订单)。

803d9d507da792d88ed702dfe589b3e4.png
1*uBpmc1cnNoNZJgS1qFKBdg.png

公司预计每天会有数百万活跃客户,并决定使用一个包含 3 个节点的分布式数据库集群以增强可扩展性和可用性。

在开发阶段,数据库均匀地分布了所有应用程序记录到集群中,确保每个节点存储了可比较量的数据并处理了类似的读写工作负载。

a82296402da228697488123a104d5849.png
1*PY6kmAwY7GWsw1s_MsUA2A.png

在一个架构委员会会议期间,公司决定尝试共置表格功能,该功能允许将子表格记录与父表格的行一起存储。

结果,Order(子表格)与 Customer(父表格)共置,并且数据库开始在相同节点上将订单与其客户记录一起存储。

e60481efd60adbb9941c68d865e524d0.png
1*1lJCGuCgQ-9KYYMgQNyEiQ.png

团队选择了实验表共置技术来评估一些请求的性能改进,这些请求需要在 Customer 和 Order 表格之间进行 JOIN 操作。例如,当应用程序需要计算客户的总支出时,该请求将在特定的数据库节点上执行。

a8f387fb5f124aa0178a70a91e4947f9.png
1*RI9rWUhsS9q0QxizdoDnxA.png

公司确实观察到了一些查询的性能改进。

交错表格

在电子商务服务的开发阶段,公司探索了几个分布式 SQL 数据库。其中一个数据库提供了交错表格的支持,促使团队也尝试了这种表格类型。

交错表格是共置表格的一种特定类别。与共置表格类似,交错表格将子表格记录与其父表格记录一起存储。但与经典共置表格不同,经典共置表格在物理表格结构中将子和父记录存储在不同的物理表格结构中,交错表格则在同一表格结构和数据库文件中 物理地 将子行放置在其父行旁边(逻辑上,Customer 和 Order 仍然是不同的表格)。

4952ad958dadc1274d6026403d6d2a6d.png
1*gqfZ9jxN9Lj2kWYddg3PvQ.png

通过这种存储级别的优化,公司发现了与之前经典共置表格测试的相同查询的额外性能增加。这种增加是因为客户及其订单存储在内存和磁盘中的同一页面上,需要更少的查找。

06b6e4b36ecd7e5572539923e4fd7707.png
1*EF-N6ihjeljuNrV8OB7NUw.png

共置和交错表格权衡

随着时间的推移,公司接近电子商务应用程序的预生产测试阶段,出现了新的挑战。

当团队加载一个生产级数据集并开始负载测试时,他们遇到了共置表格的第一个权衡 — 数据和负载倾斜。此外,由于新的业务需求,工程团队遇到了这些表格特定的另一个权衡 — 选择最佳的父表格进行共置。

数据和负载倾斜权衡

数据倾斜是指集群中的一个节点开始存储比其他节点显着更多的应用程序记录。这种不平衡通常导致负载倾斜,因为过载的节点必须处理更多的应用程序请求并处理更大的数据量。

在早期开发阶段,团队已经注意到某些客户比其他客户更频繁地购物。这种客户行为导致某些数据库节点存储的订单比其他节点多。例如,第二个节点最终存储了比第一和

第三个节点合计更多的订单(5 > 2 + 2 = 4)。

843f64a8d79328cc2e2aa6eb68410d6f.png
1*rgg2gwki8vgyD-6PRCydcw.png

当公司开始在使用生产级数据集的预生产环境中进行测试时,这些数据和负载倾斜问题变得更加明显。虽然某些客户在系统中只有几十个订单,但其他购物频率更高的客户则积累了数百甚至数千个通过应用程序处理的订单。

568d2c67e2e738fe62f1a7fa6c49a5ff.png
1*d048g-IFdPWiBkJLFlJdKg.png

这些经常购物的顾客是某些节点存储和处理更多数据的主要原因。

据我所知,针对这种特定的数据倾斜问题没有简洁的解决方案。共置表格将子记录映射到存储父记录的节点,并且每个父记录一次只能映射到一个数据库节点。

因此,为了将特定客户的订单分布到多个节点,必须有多个标识该客户的记录。例如,通过在 Customer 主键 (id, bucket) 中添加 bucket ID,你可以为经常购买者创建多个记录 — Customer (1, 1)Customer (1, 2)Customer (1, 3) 等。然后,可以将客户的订单添加到特定的桶中,从而允许数据库将它们分布到多个节点。然而,这种方法使应用程序逻辑变得更加复杂,需要决定桶的数量和每个新订单的合适桶。

最佳父表格权衡

共置表格的第二个权衡与选择最合适的父表格进行共置有关。

实际上,电子商务应用程序的数据库架构要复杂得多,涵盖了许多关系和依赖关系。

例如,尽管客户最初打算购买一件商品,但通常会最终在购物车中有几个产品。因此,一个订单可能包括两个或更多已购买的产品。

假设公司引入了 SoldProducts 表格来跟踪所有客户订单中销售的产品。类似于 Orders 表格,决定将这个新表格与 Customer 表格共置。

a6a1ce6891ac2fb7c54a6824c4987f68.png
1*Aeo_NiRH5YkXVKfB1ZL5jw.png

选择这种共置策略是有原因的。应用程序经常需要执行请求,这些请求连接了 CustomerOrder 和 SoldProduct 表格的数据。例如 — 客户在最近一个月内购买了什么产品?

因此,订单和已售产品的记录现在都与保持其客户记录的数据库节点一起存储。

492c0be8cfa28fcd487f0b71d1562e4a.png
1*aDSqqtXu4HMhhUOhu0Enyg.png

然而,在预生产测试的中途,来自业务团队的新要求出现了。他们的目标是优先考虑一个专门用于商家和公司物流以及业务增长部门的微服务。该服务旨在使商家和公司能够跟踪和预测各种产品的需求和可用性。通过实施此功能,公司可以通过向具有相似喜好的客户推荐热门产品来提高销售,而商家则可以主动补充产品。

工程团队决定将表 Product(子表格)记录与 Merchant 表格(父表格)的行共置。

9ca81159c5d1e35892c7bd9480d263ad.png
1*hytOB_Dax3pOO8vDchivaQ.png

然而,从性能的角度来看,这种方法证明是不够的,因为许多查询需要连接 MerchantProduct 和 SoldProduct 表格的数据。这样一个查询的示例是 — 最近 12 小时内购买的最热门产品是什么?

从技术上讲,将已售产品记录存储在相应的商家附近是可行的。但有一个复杂问题 — SoldProduct 记录已经与 Customer 表格共置,以满足另一个微服务的要求。

6f74b92d28df42042a011dc93855c8d7.png
1*jDJ8WE9D0ZDbYNBCAUdNug.png

这是最佳父表格权衡的一个例子。例如,SoldProducts 表格一次只能与一个父表格共置。确定哪种共置策略从长远来看是最好的通常是一项困难的任务。

总结

像每一种优化技术一样,表共置和交错都有其优点和权衡。要确保共置不是你的用例的过早优化,首先在没有共置的情况下运行应用程序工作负载。检查查询执行计划,并应用避免需要共置表格的优化。有时,你只需要创建适当的索引,为 JOIN 操作启用批处理,为页面缓冲区提供更多内存等 — 在看到执行计划之前你永远不会知道。但是,如果什么都不起作用,那么考虑共置表格,确保它们的权衡不会对长期产生不良影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/248393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Echarts 热力图与折线图的结合

热力图与折线图结合使用(文末含源码) 这种需求并不多见,遇到后第一时间翻看了Echars官方文档,并没有发现类似的例子。于是自己动手合并了双轴,后发现折线图会被遮盖。经过排查发现了一个关键参数:visualMap的配置。这个配置在热力…

什么是客服RPA?客服RPA应用场景有哪些?客服RPA解决什么问题?

客服RPA,全称Robotic Process Automation,即机器人流程自动化。它是一种软件机器人,可以模拟人类在计算机上执行的任务,包括数据输入、网络浏览、电子邮件和文本消息发送等。 客服RPA适用于自动化处理客户咨询、投诉、退货等业务流…

wps左上角有绿色小三角的数字如何求和

1.这个状态是求和不了的,使用求和公式求出来的也是0 2.进行如下操作 3.转换好后 则可以求和成功了

C++ 学习系列 -- 模板 template

一 C 模板介绍? C 为什么引入模板? 我的理解是: C 引入模板的概念,是为了复用重复的代码,当某些代码除了操作的数据类型不同以外,其他逻辑全都相同,此时就适合采用模板的方式。 定义模板类或者…

2023.12.13 关于 MySQL 复杂查询

目录 聚合查询 聚合函数 group by 子句 执行流程图 联合查询 笛卡尔积 内连接 外连接 左外连接 右外连接 自连接 子查询 单行子查询 多行子查询 EXISTS 关键字 合并查询 union on 和 union 的区别 聚合查询 聚合函数 函数说明COUNT([DISTINCT] expr)返回查询到…

ClickHouse Kafka 引擎教程

如果您刚开始并且第一次设置 Kafka 和 ClickHouse 需要帮助怎么办?这篇文章也许会提供下帮助。 我们将通过一个端到端示例,使用 Kafka 引擎将数据从 Kafka 主题加载到 ClickHouse 表中。我们还将展示如何重置偏移量和重新加载数据,以及如何更…

数据库和数据仓库的区别

数据仓库是在数据库已知大量存在的前提下,为了进一步挖掘数据资源,为了决策需要产生的;数据仓库在设计的时候有意添加反范式设计,目的是提高查询效率 对比内容数据库数据仓库数据内容近期值历史的 归档的数据数据目标面向业务操作…

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码)

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码) 基本概念典型相关分析综合评价模型对应分析因子分析聚类分析 习题10.41. 题目要求2.解题过程3.程序 习题10.51. 题目要求2.解题过程3.程序 习题10.6(1&a…

[原创][R语言]股票分析实战:周级别涨幅趋势的相关性

[简介]常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、De…

SQL Server数据库使用T-SQL语句简单填充

文章目录 操作步骤:1.新建数据库起名RGB2.新建表起名rgb3.添加三个列名4.点击新建查询5.填入以下T-SQL语句,点击执行(F5)6.刷新之后,查看数据 操作环境: win10 Microsoft SQL Server Management Studio 20…

Leetcode—237.删除链表中的节点【中等】

2023每日刷题(六十) Leetcode—237.删除链表中的节点 偷天换日实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { pub…

动态内存管理,malloc和calloc以及realloc函数用法

目录 一.malloc函数的介绍 malloc的用法 举个例子 注意点 浅谈数据结构里的动态分配空间 二.calloc函数的介绍 三.realloc函数的介绍 四.柔性数组的介绍 为什么有些时候动态内存函数头文件是malloc.h,有些时候却是stdlib.h 一.malloc函数的介绍 malloc其实就是动态开辟…

npm ,yarn 更换使用国内镜像源,阿里源,清华大学源

在平时开发当中,我们经常会使用 Npm,yarn 来构建 web 项目。但是npm默认的源的服务器是在国外的,如果没有梯子的话。会感觉特别特别慢,所以,使用国内的源是非常有必要的。 在这里插入图片描述 Nnpm, yarn …

[极客大挑战 2019]BuyFlag1

打开网站: 右上角有个菜单 (menu) ,先点一下,然后就进入了 pay.php 页面。 其中关键信息如下: ## FlagFlag need your 100000000 money### attentionIf you want to buy the FLAG:You must be a student from CUIT!!!You must…

云端赋能大湾区:华为云照亮数字化转型之路

编辑:阿冒 设计:沐由 在中国的经济版图上,大湾区是极其重要的增长引擎。这块富有活力和创新力的经济区域里,荟聚了大量的高新技术企业,以及一批创新孵化器和科研机构,产业升级和技术创新的氛围格外浓烈。 1…

「Verilog学习笔记」单端口RAM

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule RAM_1port(input clk,input rst,input enb,input [6:0]addr,input [3:0]w_data,output wire [3:0]r_data ); //*************code***********//re…

python实现websocket上传音频并测试

WebSocket是一种全双工通信协议,允许在单个TCP连接上进行双向通信。WebSocket协议允许服务器通过将请求头Upgrade设置为WebSocket来升级HTTP连接。这使得WebSocket协议可以在浏览器和服务器之间建立持久连接,能够实现实时数据传输和通信。 WebSocket协议…

C++STL中string详解(零基础/小白,字符串)

目录 1. 基本概念: 1.1 本质: 1.2 string和char*区别: 1.3 特点: 2. 构造函数(初始化) 3. 赋值操作 4. 字符串拼接 5 查找 和 替换 6. 字符串比较 7. 字符存取 8. 插入和删除 9. 子串获取 1. 基本概念: 1.…

Pytorch从零开始实战13

Pytorch从零开始实战——ResNet与DenseNet探索 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet与DenseNet探索环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook,使用Python3.8,P…

搭建你的知识付费小程序平台:源码解析与技术实现

知识付费小程序平台在当今数字化时代扮演着越来越重要的角色,为教育者和学习者提供了一个灵活、便捷的学习环境。本文将以关键词“知识付费小程序源码”为基础,探讨如何搭建一个功能强大的知识付费小程序平台,并提供一些基础的技术代码示例。…