首页 > 其他分享 >或许我们都被分库分表约束了思维

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

时间:2024-02-22 15:00:11浏览次数:20  
标签:思维 分库 分区 PARTITION MySQL 分表 TABLE

概述

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

从业数据库领域三年有余了,从分库分表中间件到数据库团队内核学到了很多东西。也接触了很多项目,包括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文档都可以学习到。

标签:思维,分库,分区,PARTITION,MySQL,分表,TABLE
From: https://www.cnblogs.com/Jcloud/p/18027362

相关文章

  • 马斯克称首位受试者可凭思维操控鼠标;字节低调推出视频模型丨 RTE 开发者日报 Vol.148
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 思维导图工具Xmind
    下载链接:https://pan.baidu.com/s/12wVLRIrwy4rOzvMuzy8ofg?pwd=h008xmind免费安装使用教程_xmind安装csdn-CSDN博客......
  • 分布式下的数据拆分,读写分离,分库分离相关问题
    一、为什么要用分库分表当不使用分库分表的情况下,系统的性能瓶颈主要体现在:当面临高并发场景的时候,为了避免Mysql崩溃(MySql性能一般的服务器建议2000/s读写并发以下),只能使用消息队列来削峰。受制于单机限制。数据库磁盘容量吃紧。数据库单表数据量太大,sql越跑越慢而分库分......
  • P9820【橙】-思维题
    这道题被样例误导了,没想到思路,看了眼提示才做出来。代码本身很简单,关键在于能不能想到思路。Code#include<iostream>usingnamespacestd;stringsa[1005],sb[1005];intN,M,mc;intmain(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>N>>M; for(int......
  • CF1624D【黄】-思维题
    题目:https://www.luogu.com.cn/problem/solution/CF1624D这道题很简单,但是启发我把这一类题都起名为思维题,贪心题大部分都是思维题,但还有很多不属于贪心题的思维题,总之思维题就是考察思维能力,和算法无关,通常能做出来的都能轻松做出,做不出来的想破头也想不出来,这道题属于前者。C......
  • (视频)跨学科思维
    代谢增长论(一)大统一理论的四种方式建模砖块(基函数)统一观察参照系改变相互作用模式统一思维方式的统一分工受市场规模限制,争夺的是市场份额,以实现收支平衡外生增长的规模积累,内生增长的知识积累。知识不是积累是淘汰(二)中西文明的本质差异中国精耕细作的小农经济,劳动密......
  • 基于概念映射的问题提出方法对学生学习成绩和批判性思维倾向的影响:在文言文学习情境
    (Effectsofaconceptmapping-basedproblem-posingapproachon students’learningachievementsandcriticalthinkingtendency: AnapplicationinClassicalChineselearningcontexts) doi:10.1111/bjet.13007一、摘要研究目的:在语言课程中,培养学生的系统思维能......
  • Codeforces Round 924 (Div. 2)B. Equalize(思维+双指针)
    目录题面链接题意题解代码题面链接B.Equalize题意给一个数组\(a\),然后让你给这个数组加上一个排列,求出现最多的次数题解赛时没过不应该。最开始很容易想到要去重,因为重复的元素对于答案是没有贡献的。去重后排序。,然后维护一个极差小于n-1的区间,,区间长度就是可能的答案......
  • Codeforce-- 思维题
    2-11Eatthechip思路:题意可知,a从下往上走,b从上往下走,我们可以思考一个问题,在某一个回合,如果a和b在同一列中(a是Alice,b是Bob),一方怎么走,另外一方就跟着这一方走,所以同一列的时候是该回合后手的必胜态,先手的必败态。于是可以递推:如果在走到边界的时候有机会仍然保持b在a的上方,那么......
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
    目录题目链接题意题解代码题目链接C.DigitalLogarithm题意给两个长度位\(n\)的数组\(a\)、\(b\),一个操作\(f\)定义操作\(f\)为,\(a[i]=f(a[i])=a[i]\)的位数求最少多少次操作可以使\(a、b\)两个数组变得完全相同题解性质:对于任何数,经过两次操作我们一定可以让其变为\(......