0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

或许我们都被分库分表约束了思维

京东云 来源:张俊杰 作者:张俊杰 2025-02-21 09:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:张俊杰

概述

这篇文章没什么太多的干货,纯纯是一篇讨论和思考帖。

从业数据库领域三年有余了,从分库分表中间件到数据库团队内核学到了很多东西。也接触了很多项目,包括TiDB、Vitess、Polardb、StarDB等等。

国内的项目好像很多都聚焦于分库分表的概念,包括很多的数据库团队都在尝试这个概念的落地和沉溺于性能的跑分。

最近我在预览MySQL官方,看到了Partitioning的概念,而且占据了很大的篇幅。不由得引人思考,为什么这个概念在我接触的业务中没有被广泛的使用呢?或许我们将来可以有分库分区的概念?

接下来从头缕一下数据库选型的问题吧(以下均以MySQL的Innodb场景为例):

分表、分区、分库有什么用处

在那个远古的时代,物理机器的配置很低,当数据量增大的时候,传统的B+树的高度会越来越高,我们对硬件资源的要求很高,机器往往内存爆仓、IO打满等等。

这导致:

查询速度显著下降。复杂的查询、索引失效、全表扫描等操作变得缓慢。

在大表中创建和维护索引可能会消耗大量的时间和资源。插入、更新和删除操作可能需要花费更长的时间来维护索引,导致性能下降。

读写操作可能导致锁冲突,降低系统的并发处理能力,甚至引发死锁问题。

备份、恢复、数据清理、空间管理等操作变得困难,维护成本和风险增加。

等等。。

后来我们引出了第一个概念:分表

分表

在 5.1版本以前,MySQL并没有分区的概念,为了解决这个问题,无非是单表拆成双表、多表之类的,这样将一个表要面临的问题分散成了两个表或者多个表共同承受。

反思当下,在当前这个物理资源冗余的时代,大部分业务场景下我们的单表真的会比分表的性能差很多吗?有多少时候我们是为了分表而分表?我们的分表逻辑或许需要我们支持更多的功能,比如弹性、事务、一些查询语句的改写,然后一遍一遍的造轮子给运维带来无尽的痛苦。

分库

分表的解决能力还是有限的,我们一台物理机器的能力也是有限的,这时候或许我们可以采用分表的形式,来避免热点问题或者单机器压力过载的问题。

将一个库要面临的问题分散成了两个库或者多个库共同承受。

分区

相关文档

在5.1版本以后MySQL出了一个国内几乎无人问津的分区表的功能。

分区表的实现原理其实和分表差不太多,不过它更靠近文件系统,而没有经过MySQL的应用层或者引擎层。MySQL的物理数据,存储在表空间文件(.ibdata1和.ibd)中,这里讲的分区的意思是指将同一表中不同行的记录分配到不同的物理文件中,几个分区就有几个.idb文件

随着 MySQL 版本的更新迭代,分区功能也在后续版本中不断得到改进和增强。具体的分区功能支持情况如下:

•MySQL 5.1:引入了 Range 和 List 两种分区类型。支持基本的分区管理和查询优化。

•MySQL 5.5:对分区表的查询优化有所改进,提升了性能。

•MySQL 5.6:引入了更多的分区管理功能,包括 subpartition 子分区、分区交换操作、CHECK 约束等。

•MySQL 5.7:进一步增强了分区表的功能,包括 hash 分区类型、NOWAIT 选项、ALTER TABLE ... EXCHANGE PARTITION 和 ALTER TABLE ... REBUILD PARTITION 等操作。

•MySQL 8.0:继续对分区表进行优化和增强,包括对于自动生成分区键值、分区表的查询性能提升等方面的改进。

这样看起来,这不完全Cover住了分表的概念吗?甚至,这不比业界的分表做的还要好吗。

那为什么我们还要痴迷于分表,或许我们可以采用分区的逻辑吧?

当然,还有一些延伸到运维操作,举个例子:

分区表怎么扩容

详见 ALTER TABLE 语句

1.创建新分区:使用 ALTER TABLE 命令添加新的分区。例如,如果是按照时间范围分区的表,可以增加新的时间范围的分区。

ALTER TABLE your_partitioned_table
ADD PARTITION (PARTITION p_new VALUES LESS THAN (new_value));

这里的 new_value 是新的分区范围。

2. 数据迁移:使用 ALTER TABLE ... REORGANIZE PARTITION 命令将现有分区中的数据迁移到新的分区中。例如,可以通过将旧分区的数据移动到新分区来实现。

ALTER TABLE your_partitioned_table
REORGANIZE PARTITION old_partition INTO
(PARTITION p_new VALUES LESS THAN (new_value));

这里的 old_partition 是要移动数据的旧分区。

3. 数据清理(可选):在确认数据迁移成功后,可以考虑清理不再需要的旧分区。使用 ALTER TABLE ... DROP PARTITION 命令可以删除不再需要的旧分区。

ALTER TABLE your_partitioned_table
DROP PARTITION old_partition;

这里的 old_partition 是要删除的旧分区。

显而易见,这是一个原地扩容操作,我们或许不需要引入什么复杂的组建或者逻辑去做resharding。

落地方案猜测

我们或许可以在单表业务场景下遇到问题瓶颈后采用分区的概念,如果分区不够可以采用原地扩容逻辑。当机器达到瓶颈后采用分库的概念达成分库分区的逻辑。

这只是一个猜想,对于我们的数据库厂商,其实只需要将这套逻辑维护好做到高可用的逻辑即可。

当然,围绕着分区和物理数据库我们还有很多扩展内容可以去做,但是这篇文章旨在说明,或许我们不应该被分库分表约束了思维,或许我们不需要做分布式的逻辑,或许在机器性能良好的场景下我们单机器就可以cover住我们的数据量。

此外,一个数据库产品或许应该做到serverless的概念,我们用户不需要理解这么多的逻辑,至于分区或许这个看MySQL文档都可以学习到。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MySQL
    +关注

    关注

    1

    文章

    897

    浏览量

    29231
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于MCU200T的蜂鸟E203不上板跑教程

    : (1)System文件 地址:e203_hbirdv2-master/e203_hbirdv2-master/fpga/mcu200t/src/system.v (这里我们选用的是mcu200t
    发表于 10-24 11:54

    时序约束问题的解决办法

    Time 是否满足约束我们要留意的是 WNS 和 WHS 两个数值,如果这两个数值为红色,就说明时序不满足约束。下面将解释怎么解决这个问题。 1. Setup Time 违例 Setup
    发表于 10-24 09:55

    关于综合保持时间约束不满足的问题

    clock interaction,得到以下结果: 5、异步时钟设置完成后,再重新综合得到时序报告如下: 时序约束满足
    发表于 10-24 07:42

    技术资讯 I Allegro 设计中的走线约束设计

    ,能够在走线的时候清楚的知道目标在哪里,允许的误差是多少、最小间距等。上期我们介绍了如何使用cadenceAllegro的规则“约束”孔,实现一键式快速生成孔;本期我
    的头像 发表于 09-05 15:19 901次阅读
    技术资讯 I Allegro 设计中的走线<b class='flag-5'>约束</b>设计

    技术资讯 I 图文详解约束管理器-差分对规则约束

    !Allegro约束管理器搞差分对,简直是把高速设计的「地狱模式」切换成「新手村」!上期我们介绍盲/埋孔的使用,本期我们将教会大家如何使用Cadence的
    的头像 发表于 08-08 17:01 926次阅读
    技术资讯 I 图文详解<b class='flag-5'>约束</b>管理器-差分对规则<b class='flag-5'>约束</b>

    RISC-V 的平台思维和生态思维

    Doorn 认为,RISC-V 扩展要拥抱 “平台思维” 和 “生态思维”。   在 7 月 17 日举办的第五届(2025)RISC-V 中国峰会主论坛上,Leendert van Doorn 谈到
    发表于 07-17 14:04 4086次阅读

    PCB Layout 约束管理,助力优化设计

    本文重点PCBlayout约束管理在设计中的重要性Layout约束有助避免一些设计问题设计中可以使用的不同约束在PCB设计规则和约束管理方面,许多设计师试图采用“一刀切”的方法,认为同
    的头像 发表于 05-16 13:02 822次阅读
    PCB Layout <b class='flag-5'>约束</b>管理,助力优化设计

    PanDao:实际约束条件下成像系统的初始结构的生成

    的平均RMS光斑尺寸约为55 μm,色差校正效果中等。基于同等规格与约束我们采用自主研发的FTR初始透镜生成器,在数分钟内即创建出多个更加优质的设计方案。图1展示由FTR程序生成的五类不同透镜系统
    发表于 05-07 08:57

    FPGA时序约束之设置时钟组

    Vivado中时序分析工具默认会分析设计中所有时钟相关的时序路径,除非时序约束中设置时钟组或false路径。使用set_clock_groups命令可以使时序分析工具不分析时钟组中时钟的时序路径,使用set_false_path约束
    的头像 发表于 04-23 09:50 967次阅读
    FPGA时序<b class='flag-5'>约束</b>之设置时钟组

    一文详解Vivado时序约束

    Vivado的时序约束是保存在xdc文件中,添加或创建设计的工程源文件后,需要创建xdc文件设置时序约束。时序约束文件可以直接创建或添加已存在的约束文件,创建
    的头像 发表于 03-24 09:44 4385次阅读
    一文详解Vivado时序<b class='flag-5'>约束</b>

    VirtualLab Fusion应用:使用自定义的评价函数优化高NA束器

    我们演示两种具有不同配置目标和约束的优化: 在优化#1中,优先考虑均匀性误差。 在优化#2中,0级也要最小化。 关于评价函数约束,用户可以指定 单独的目标值、范围、下限或上限
    发表于 03-07 08:54

    数显千分表的数据如何用存储器进行接收?

    数显千分表的数据如何用存储器进行接收
    发表于 02-11 06:01

    vivo V50 5G手机现身Geekbench跑分库

    vivo V50 5G 手机悄然现身 Geekbench 跑分库,型号为 V2427,引发科技爱好者的广泛关注。 跑分数据显示,vivo V50 5G 的 Vulkan 分数达到 4122 ,表现
    的头像 发表于 02-05 15:22 1099次阅读

    不是!让高速先生给个过孔优化方案就那么难吗?

    我们之前的文章也有分享过,不同长度的层出线,过孔阻抗也会有不小的差异哈。 差分过孔间距不同 仔细看给过来的过孔指导,其实只约束了信号孔到地过孔的距离,但是没对信号孔之间的距离做约束,那我们
    发表于 01-21 08:50

    xilinx FPGA IOB约束使用以及注意事项

    xilinx FPGA IOB约束使用以及注意事项 一、什么是IOB约束 在xilinx FPGA中,IOB是位于IO附近的寄存器,是FPGA上距离IO最近的寄存器,同时位置固定。当你输入或者输出
    的头像 发表于 01-16 11:02 1486次阅读
    xilinx FPGA IOB<b class='flag-5'>约束</b>使用以及注意事项