或许我们都被分库分表约束了思维
概述
这篇文章没什么太多的干货,纯纯是一篇讨论和思考帖。
从业数据库领域三年有余了,从分库分表中间件到数据库团队内核学到了很多东西。也接触了很多项目,包括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住了分表的概念吗?甚至,这不比业界的分表做的还要好吗。
那为什么我们还要痴迷于分表,或许我们可以采用分区的逻辑吧?
当然,还有一些延伸到运维操作,举个例子:
分区表怎么扩容
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文档都可以学习到。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
漫谈数据分布可视化分析
作者 | FesianXu 导读 在实际工作中,我们经常会遇到一堆数据,对数据的有效分析至为关键,而数据的分布就是一种非常重要的数据属性,需要通过合适的可视化手段进行分析。本文参考[1],基于seaborn库介绍一些常用的数据分布可视化方法。 全文8720字,预计阅读时间22分钟 数据的分布,我们可以理解为是“数据的形状”。一个“完美”的数据分布,会将数据所有可能的数据点都囊括其中,因此数据的分布表征了不同数据之间的本质区别。然而现实生活的数据不可能对所有可能的数据点都进行遍历(因为通常会有无限个数据点),因此我们通常都是在某个采样的子集中,尝试对数据本原的分布进行分析。常见的数据分布可视化方法有以下几种: 1.直方图(Histogram) 2.条件直方图(Conditional Histogram) 3.核密度估计图(Kernel Density Estimation,KDE) 4.累积分布函数图(Empirical Cumulative Distribution Function, ECDF) 5.箱型图(boxplot) 6.提琴图(violin plot) 7.二元直方图(bi...
- 下一篇
百亿美金的设计,深度剖析 GitLab 的 Postgres 数据库 schema
原文链接 这篇文章写于 2022 年,前一年 GitLab 刚好完成 IPO。目前 GitLab 市值超过 100 亿美金,它的所有收入都来源于同名产品 GitLab,而这篇文章就是全面分析 GitLab 这个产品的数据库 schema。 我花了一些时间研究 GitLab 的 Postgres schema。GitLab 是 Github 的一个替代品。你可以自部署 GitLab,因为它是一个开源的 DevOps 平台。 我之所以要了解 Gitlab 这样的大项目的 schema,是为了与我正在设计的 schema 进行比较,并从他们的 schema 定义中学到一些最佳实践。我确实从中受益良多。 我清楚的知道,最佳实践取决于具体情况,不能盲目应用。 GitLab 的数据库 schema 文件 structure.sql [1] 包含超过 34000 行代码。GitLab 本质上是一个集成式的 Ruby on Rails 应用。虽然通常我们会用 schema.rb 文件来管理数据库的版本迁移,但 GitLab 团队在他们的问题追踪系统中的一个讨论 [2] 说明了他们选择 structur...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8编译安装MySQL8.0.19