数据库性能优化入门:数据库分片初探

news2025/1/18 16:49:19

数据库分片是一种用于提升数据库性能的架构模式,选择正确的分片策略和实施方式对于提高数据库性能和应对大规模数据挑战至关重要。

本文介绍了数据库分片的定义、原理和实施方法。文章解释了数据库分片是如何通过将数据切分、分散存储在多个服务器上来提升性能,并对数据库分片与传统数据库的区别进行了详细对比,探讨了何时应该考虑进行数据库分片。文章介绍了几种常见的分片策略,包括基于键、基于范围、垂直和基于目录的分片,并分析了它们的优缺点。文章还讨论了数据库分片的实施步骤和长期解决方案,强调了 TiDB 作为支持自动分片的分布式 SQL 数据库的优势 。

数据库分片是一种提升数据库性能的策略,通过把数据切分成若干部分,然后将这些部分分散存储在多个数据库服务器上。 这些被切分的数据部分称为“分片”,每个分片都包含数据的一部分。 把所有分片合起来,就构成了完整的数据集,且每条数据仅存储在一个分片中。 由于涉及更多的机器参与处理,分片能让数据库处理更多事务,存储更多数据。 对于那些需要高可扩展性的大型分布式系统,数据库分片特别有效。

数据库分片是一种“无共享”架构的体现,即每个分片操作独立的数据库服务器,不与其他分片共享任何计算资源。比如,下方左图展示了存储在计算机上的一个原始表:

若原始表非常大,查询操作就会变得非常缓慢。采用分片架构可以提升查询性能,如右图所示,数据被分成两部分,一部分存储在数据库服务器 DB1 上,另一部分则存储在 DB2 上。通过这种方式,把数据分散存储在多个服务器上,就实现了分片。

在设置数据库分片时,分片策略的选择将直接影响数据库性能。我们将在文后详细探讨不同的分片方法。这篇文章旨在深入介绍数据库分片的原理,并揭示这一流行架构模式的所有细节。

传统数据库的局限性

传统数据库通常运行在单一服务器上,无论是实体服务器、虚拟机还是其他形式的节点。这些系统的一个共同点是它们的性能存在上限。这也意味着,为了满足快速增长的数据处理需求,你可能需要将数据库迁移到更强大但成本更高的硬件上。一旦数据库超出当前机器的处理能力,你就必须重复这一过程。

还有另一种既昂贵又复杂的解决方法,你可以在你的环境中添加新的数据库硬件。但这需要某种方式智能地将数据分布在多台机器上,通过在多个数据库服务器上增加一个软件层或将这个能力添加到你的应用程序中来实现。这种做法非常普遍,业界也形成了专门的术语–数据库分片。

数据库分片和分区的区别是什么?

数据库分片与分区(partitioning https://docs.pingcap.com/zh/tidb/stable/partitioned-table ) 的主要区别在于其作用范围和数据分割的方式。分区发生在单个数据库服务器内部,将数据切分为多个段,即分区,但这些分区依然处于同一数据库系统内。这类似于在一个大仓库内划分不同的区域,而分片则相当于将货物分布到多个仓库中。每个分区,就像分片一样,包含数据集的一个子集,但所有分区都位于同一数据库服务器内。这种方式有助于管理大型数据表,并在不分散负载到多个服务器的情况下提升查询效率。

下图与前面的图相似。主要区别在于,原始表被分割成块,这些块位于单个数据库服务器上。分片的数据位于多个数据库服务器上。

虽然数据库分片通过将数据分割并分布到不同的数据库中以实现可扩展性,分区则在单个数据库内组织数据以实现高效管理和访问。两者都旨在提高数据库性能,只是实现方式不同。

分区和分片不是非此即彼的事情,数据库架构中二者结合的做法也是非常普遍的,在此我们不做赘述。

我何时考虑进行数据库分片?

决定何时以及是否对数据库进行分片,就像挑选扩展业务的恰当时机一样——时机与必要性并重。数据库分片并非万能钥匙,会引入一定的复杂性。

1 何时分片

  • 面对高流量与大数据量 :当数据库承受数百万用户或 TB 级别数据的压力开始挣扎时,分片便显得尤为必要。
  • 扩展性需求迫在眉睫 :业务快速成长,持续的数据与用户增长成为了新常态。
  • 性能遇到瓶颈 :查询反应迟缓,数据层面的瓶颈开始显现。

2 何时避免分片

  • 数据库规模尚小 :未触及存储或处理能力的上限。
  • 简单的工作量 :数据库未面临复杂查询或高交易量的挑战。
  • 技术资源受限 :分片需要专业的知识进行实施与管理,若团队尚未准备好迎接这种复杂性,最好暂缓行动。

记住, 数据库分片不是银弹,考虑周全后再决策是否适合你的数据库需求 。

分片架构的选择

分片策略的关键在于通过使用分片键,将数据高效分布至不同的分片中。不同的策略各有优缺点,选择应基于数据库的具体需求和特性。

1 基于键的数据库分片

基于键的分片利用特定值,如用户 ID 或时间戳,作为分片键。

如下图所示,我们选择了列 1 作为分片键。然后,我们对数据项应用哈希函数。哈希键决定了我们的数据将去往哪个分片。

基于键的分片有利于实现均匀分布数据。可随着数据增长,需要重新整理已有数据,维护成本较高。

2 基于范围的数据库分片(水平分片)

使用基于范围的分片方式会根据一系列值(如日期或地理位置)的范围进行数据分片划分。

在下图中,我们选择了基于 Paint Color 列进行分片, Paint Color 是一个数值。数据库将采用此数值以及分片范围来确定数据应该放置的位置。

这种方法根据范围(如字母顺序或日期范围)来实现数据分片,简单明了,非常适合时序数据这样具有清晰、均匀划分的数据类型。但如果某些范围比其他范围拥有更多数据(即热点),则可能导致数据分布不均。

3 垂直数据库分片

垂直分片根据表列分割数据,并将列分布在不同的分片中。这种模式用于将宽表分割成多个表,其中一个表比另一个表更窄,而这个更窄的表将包含最常查询的数据。如果需要查询第二个表数据的时候,你可以将第二个表与第一个表连接。

垂直分片适用于包含大量未使用列的表,通过隔离频繁访问的数据来提高性能。

4 基于目录的数据库分片

基于目录的分片策略根据表列分割数据,并将列分布在不同的分片中。

在下图中,我们再回到之前使用的 Paint Color 列。在这个例子中,我们使用字典(也称为查找表)将数据放置在特定的分片中。

此种分片策略适用于包含大量未使用列的表数据库,通过隔离频繁访问的数据来提高性能。

这种分片方法涉及使用查找目录来跟踪哪些数据在哪个分片上。虽然它提供了很大的灵活性并且可以很好地处理数据不均匀分布的问题,但引入的查找目录也带来了单点故障的风险。同时,维护和保持目录的一致性也是重要的考虑因素。

手动分片还是自动分片?

我们已经讨论了分片策略,但还有更关键细节:由谁来实施分片?换句话说,你可以手动分片你的数据库,或者你可以使用中间件层或可以有效自动分片数据的数据库。

让我们来看看我们可以使用哪些具体方法来实现手动分片或自动分片数据库:

1 自动分片:使用分布式 SQL 数据库

分布式 SQL 数据库本身就支持自动分片,大大简化了数据库的扩展和维护。

  • 优点:内置自动分片机制、具备可扩展性和高可用性,同时减少了维护工作量。
  • 缺点:可能需要从现有系统迁移和新的操作专业知识。其实所有分片方案都会涉及环境变化和新技能的学习。使用支持自动分片的分布式数据库提供了可靠的长期解决方案。

2 自动分片:中间件解决方案

中间件解决方案是指使用像 ProxySQL 或 Vitess 这样的为 MySQL 设计的分片中间件。这些工具部署在你的应用程序和数据库之间,透明处理分片逻辑。

  • 优点:简化了分片过程并对应用程序透明。
  • 缺点:增加了另一个需要管理的架构层级,并增加了学习曲线,这也意味着更高的软件、硬件和管理成本。

3 手动或自动分片:使用内置分片能力的数据库

如 MySQL Cluster 或 MariaDB 等数据库都包含内置分片功能,可以提供更 MySQL 原生的分片解决方案:

  • 优点:与 MySQL 生态系统的原生集成。
  • 缺点:可能比其他分布式 SQL 数据库的灵活性差,因为分片能力是后来加入的。相比起来,分布式 SQL 数据库则是从一开始就支持自动分片。

4 手动分片:应用层分片

应用层分片策略通过修改你的应用程序逻辑,以在多个数据库实例间分配数据。该策略让你有更多控制权,但需要大量的开发工作。

  • 优点:对分片逻辑有高度控制。
  • 缺点:需要大量的开发和维护工作。扩展数据库需要大量的规划,执行通常需要停机时间。实施这种策略往往会带来可能会在应用程序生命周期中不断重复的数据库咨询项目。

数据库分片项目步骤

数据库分片是一项复杂的工程,往往包含以下实施步骤:

  1. 确定分片需求:评估你的数据库以了解分片的需求。考虑因素如数据量、事务率和性能问题。
  2. 确定计算和存储需求:这是此过程中最重要的步骤之一。如果你正在对一个本地数据库进行分片,你可能需要购买硬件。如果你在云环境中运行,你需要估计所需虚拟机和存储的成本。当然,也别忘了软件。你可能需要额外的许可证或产品。如果你选择使用开源软件(非常推荐),你可能需要增加你的支持协议。
  3. 创建测试环境:测试环境在许多情况下简化了过程。尽管测试过程比较痛苦,但搞砸测试环境总比破坏生产系统要好。别忘了在你的规模文档中添加测试环境。
  4. 获取计算和存储资源:别忘了订购必要的软件和硬件。
  5. 选择分片策略:结合你的数据结构和使用模式,在前文中所介绍的分片策略中做出选择适合你的。
  6. 选择分片键:选择合适的分片键键以确保平衡的数据分布并最小化复杂的跨分片查询。
  7. 实施分片逻辑:这一步可在应用层完成。在数据库服务器之上增加一个分片层或使用支持自动分片的数据库管理系统。
  8. 测试:在上线前彻底测试分片数据库以确保数据完整性和性能。
  9. 监控和调整:实施分片后,持续监控分片数据库的性能,并在必要时重新平衡分片。

对于数据库分片的最佳长期解决方案

选择正确的数据库分片策略对于组织的成长至关重要。TiDB,由 PingCAP 开发的开源分布式 SQL 数据库,内置自动分片功能。它能为现代应用提供弹性扩展、实时分析和持续数据访问。使用 TiDB 进行 RDBMS 扩展以及互联网规模 OLTP 工作负载处理的公司可从以下方面获益:

  1. 与 MySQL 兼容 ( https://docs.pingcap.com/zh/tidb/stable/mysql-compatibility ):兼容 MySQL 8.0,使开发者可以利用 MySQL 生态系统中的丰富工具和框架。
  2. 水平可扩展 ( https://docs.pingcap.com/zh/tidb/stable/scale-tidb-using-tiup ):完全透明地处理数据工作负载,能根据需要即时扩展或缩减,无需手动分片。
  3. 高可用性 ( https://docs.pingcap.com/zh/tidb/dev/high-availability-faq ):在系统故障或网络问题时自动故障转移和自我修复,确保数据持续可访问。
  4. 强一致性:保持 ACID 事务的强一致性,即使是在全球分布数据时也能做到。
  5. 混合工作负载能力 ( https://docs.pingcap.com/zh/tidb/stable/quick-start-with-htap ):简化技术栈,使实时分析更加便捷,通过智能查询优化器选取最高效的查询执行计划。
  6. 混合云和多云支持 ( https://docs.pingcap.com/tidbcloud/tidb-cloud-intro ):支持在全球任意地点的公有云、私有云和混合云环境中部署数据库集群,兼容 VMs、容器或裸机部署。
  7. 开源:100%开源,遵循 Apache 2.0 许可,为业务创新开辟道路。
  8. 安全 ( https://cn.pingcap.com/law/ ):提供企业级数据加密,无论数据在传输中还是静态状态下均受保护。

结论

在我们探讨了数据库分片的复杂性和策略后,明显的结论是,尽管分片提供了一种强大的方法来处理大规模数据和高事务量,但它并不是一劳永逸的解决方案。特别是当考虑实施手动分片时,这一点尤为重要。因此,在决定分片之前,仔细评估数据库的规模、预期增长和可用的技术资源是非常必要的。

最终目标,无论是选择分片还是采取其他策略,都是确保数据库的可扩展性、高效性、易于维护性,并且能够满足应用程序当前和未来的需求。

在这方面,采用如 TiDB 这样支持自动分片的分布式 SQL 数据库,提供了一个理想的解决方案。它不仅能够应对规模的缩放挑战,还能够处理分片带来的复杂性,同时在处理大量数据时保持卓越的性能。这样的系统允许开发者专注于业务逻辑的实现,而不必过分担忧底层数据存储的细节,实现了技术架构的高效和灵活性。

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

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

相关文章

【Kotlin】委托模式

1 委托模式简介 委托模式的类图结构如下。 对应的 Kotlin 代码如下。 fun main() {var baseImpl BaseImpl()var baseWrapper BaseWrapper(baseImpl)baseWrapper.myFun1() // 打印: BaseImpl, myFun1baseWrapper.myFun2() // 打印: BaseImpl, myFun2 }interface Base {fun my…

C语言第四十弹---预处理(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 预处理 1、#和## 1.1 #运算符 1.2、##运算符 2、命名约定 3、#undef 4、命令行定义 5、条件编译 6、头文件的包含 6.1、头文件被包含的方式 6.1.1、本地…

docker从入门到熟悉

一、什么是docker? Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的快速交付…

【数据结构】考研真题攻克与重点知识点剖析 - 第 4 篇:串

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…

Pnpm + Turbo 搭建 Web Component Monorepo 组件库

技术选型 使用 Pnpm Turbo 搭建 Web Component Monorepo项目 stencil-component-ui 组件库 pnpm 作为包管理器Turborepo 作为构建系统Vitepress 管理文档 pnpm 技术 什么是 pnpm? 它有哪些优势? pnpm 跟 npm、yarn一样,都是用于管理Node包依赖的管…

硬件-1、体系架构

cpu 处理器 arm处理器的七种工作模式 arm寄存器 两张图是一样的,r0---r12是通用寄存器。其他寄存器可参考图一,cpu架构。 程序状态寄存器psr(cpsr/spsr) 程序异常处理 理解示例 当使用swi(软中断指令)指令…

Thinkphp5萤火商城B2C小程序源码

源码介绍 Thinkphp5萤火商城B2C小程序源码,是一款开源的电商系统,为中小企业提供最佳的新零售解决方案。采用稳定的MVC框架开发,执行效率、扩展性、稳定性值得信赖。 环境要求 Nginx/Apache/IIS PHP5.4 MySQL5.1 建议使用环境&#xff…

Alphabet考虑收购HubSpot:一个不太可能但未可知的大手笔动作

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

腾讯云轻量应用服务器是限制月流量吗?是的

腾讯云轻量应用服务器限制流量吗?是的,轻量应用服务器是限制月流量的。每台轻量应用服务器都是按套餐售卖点,套餐包括CPU内存、公网带宽、系统盘和月流量,腾讯云百科txybk.com以2核4G5M轻量应用服务器为例,限制500GB月…

selenium 遮罩层

之前写智联自动投简历 和boss自动投简历的时候 发现操作到上限之后就有个遮罩层,会在当前页面有个顶层得div 没办法获取下面的内容 # 假设遮罩层元素有一个特定的ID或者其他属性 没有id xpath 或者class 都可以mask_element WebDriverWait(driver, 10).until(EC.…

python 利用xpath 爬取一周天气

需求: 爬取 中国天气网指定城市一周的天气,以天津为例 实现: 1,先找到一周的数据位置。 divs html.xpath("//div[classhanml]") 2,再遍历每天。 trs div.xpath("./div/div[2]/table//tr[position…

UE4几个常用节点链接

UE4几个常用节点链接 2017-12-02 12:54 1. 流光材质(及uv平铺次数) 2. 跑九宫格 3.闪光3。1 粒子闪烁效果 4.图案重复5.平移扭曲 6.溶解 刀光的uv滚动图片源或采样节点属性里改成clamp无后期发光光晕anistropic 各向异性高光法线图 法线图叠加 blendangle orrectedNo…

STL中各类容器详细介绍

STL介绍 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C程序库。它被容纳于C标准程序库(C Standard Library)中,是ANSI/ISO C标准中最新的也是极具革命…

11-LINUX--信号

一.信号的基本概念 信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。 与信号有关的系统调用在“signal.h”头文件中有声明 常见信号的值,及对应的功能说明: 信号的值在系统源码中的定义如下: 1. #define …

数学建模-最优包衣厚度终点判别法(主成分分析)

💞💞 前言 hello hello~ ,这里是viperrrrrrr~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#xff…

STL容器(3)

1,stack容器 1.1 基本概念 概念:stack是一种先进后出的数据结构,它只有一个出口 因此: 栈中只有顶端的元素才可以被使用,因此占不允许有遍历行为 栈中进入数据称为--入栈(push) 栈中弹出数据称为--出栈&#xff08…

SYS-2722音频分析仪SYS2722

181/2461/8938产品概述: Audio Precision 2722 音频分析仪是 Audio Precision 屡获殊荣的 PC 控制音频分析仪的旗舰型号,长期以来一直是音频设备设计和测试的全球公认标准。功能齐全的 SYS-2722 提供了测试转换器技术最新进展所需的无与伦比的失真和噪声…

[机缘参悟-164] :心理架构分层模型、马斯洛需求层次模型、冰山素质模型、恋爱背叛层次模型大一统架构

目录 一、大一统架构 1.1 需求层次模型讲的是什么?need、requirment 1.2 人的心理分层模型是什么 1.3 冰山模型讲的什么? 二、婚姻的本质 2.1 婚姻是在不同层面上建立关联 2.2 恋爱的本质 2.3 婚姻是在不同层面上满足对方的需求 一、大一统架构 …

Java NIO Selector选择器源码分析

文章目录 前言Selector类结构Selector抽象类AbstractSelectorSelectorImplWindowsSelectorImpl三种SelectionKey集合 前言 Java NIO(New I/O)的Selector选择器是一个用于多路复用(Multiplexing)的I/O操作的关键组件。它允许一个单…

css实现更改checkbox的样式;更改checkbox选中后的背景色;更改checkbox选中后的icon

<input class"check-input" type"checkbox"> .check-input {width: 16px;height: 16px;} /* 设置默认的checkbox样式 */input.check-input[type"checkbox"] {-webkit-appearance: none; /* 移除默认样式 */border: 1px solid #999;outl…