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

京东云开发者
• 阅读 250

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

从业数据库领域三年有余了,从分库分表中间件到数据库团队内核学到了很多东西。也接触了很多项目,包括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 是新的分区范围。

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

ALTER TABLE your_partitioned_table REORGANIZE PARTITION old_partition INTO (PARTITION p_new VALUES LESS THAN (new_value)); 这里的 old_partition 是要移动数据的旧分区。

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

ALTER TABLE your_partitioned_table DROP PARTITION old_partition; 这里的 old_partition 是要删除的旧分区。

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

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

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

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

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
sharding
序言shardingjdbc在分库分表方面提供了很大的便利性,在使用DB的时候,通常都会涉及到事务这个概念,而在分库分表的环境上再加上事务,就会使事情变得复杂起来。本章试图剖析shardingjdbc在事务方面的解决思路。传统事务回顾传统的事务模型如下:ConnectionconngetConnecti
Stella981 Stella981
3年前
Asp.NetCore 3.1 EFCore处理Mysql的分库分表
一、什么情况下需要分库分表?Mysql单表数据量超过500万条。二、Asp.netCore技术栈,分库分表的解决方案有哪些?1、阿里云的DRDS2、Mycat 数据库分库分表中间件;3、TiDB;三、以上3种解决方案各自的特点:1、阿里云DRDS是收费的商业版,价格稍贵,但是比S
Wesley13 Wesley13
3年前
TiDB 4.0 新特性在电商行业的探索
作者介绍冀浩东,转转公司数据库负责人,负责转转公司整体的数据库运营。初引入TiDB解决了哪些问题?转转使用TiDB主要解决了两个问题,一个是分库分表问题,另一个是运维复杂度。分库分表是一个非常普遍的问题,会增加我们业务逻辑的复杂性,并且多维度的mapping可能导致我们整体性能的下降。有了
Wesley13 Wesley13
3年前
MySQL 分库分表方案
数据库分库分表前言今天有朋友问到了数据库分库分表,他们都说数据库达到了瓶颈,需要重构,但是毫无头绪,现在做个概念总结(期待后期的实操吗?)会从以下几个方面说起:第一部分:实际网站发展过程中面临的问题。第二部分:有哪几种切分方式,垂直和水平的区别和适用面。第三部分:目前市面有的一些开源产品,技术,它们的优缺点是
Easter79 Easter79
3年前
TiDB 4.0 新特性在电商行业的探索
作者介绍:冀浩东,转转公司数据库负责人,负责转转公司整体的数据库运营。初引入TiDB解决了哪些问题?转转使用TiDB主要解决了两个问题,一个是分库分表问题,另一个是运维复杂度。分库分表是一个非常普遍的问题,会增加我们业务逻辑的复杂性,并且多维度的mapping可能导致我们整体性能的下降。有了T
Easter79 Easter79
3年前
SpringBoot如何整合多个数据源,看这篇就够了
SpringBoot现在是很多很多公司应用的后端框架,因为它搭建快,能更好、更快速的整合其他第三方。那么随着业务的不断扩展,业务量的增加,这时候就会牵扯到分库分表,虽然这个词听起来很熟悉,作为程序员也很容易理解,但是我想应该也有不少读者没接触过分库分表,今天我们不聊如何分库分表,而是聊SpringBoot如何整合多个数据源的事情。也就是如何接入不同的
Stella981 Stella981
3年前
SpringBoot如何整合多个数据源,看这篇就够了
SpringBoot现在是很多很多公司应用的后端框架,因为它搭建快,能更好、更快速的整合其他第三方。那么随着业务的不断扩展,业务量的增加,这时候就会牵扯到分库分表,虽然这个词听起来很熟悉,作为程序员也很容易理解,但是我想应该也有不少读者没接触过分库分表,今天我们不聊如何分库分表,而是聊SpringBoot如何整合多个数据源的事情。也就是如何接入不同的
sharding-jdbc分库连接数优化 | 京东物流技术团队
本文介绍了分库分表的概念及优势,以及shardingjdbc分库分表中间件,探究了shardingjdbc的路由规则的执行流程
京东云开发者 京东云开发者
5个月前
分库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践
1问题域业务发展的初期,我们的数据库架构往往是单库单表,外加读写分离来快速的支撑业务,随着用户量和订单量的增加,数据库的计算和存储往往会成为我们系统的瓶颈,业界的实践多数采用分而治之的思想:分库分表,通过分库分表应对存系统读写性能瓶颈和存储瓶颈;分库分表帮