我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在MySQL中分表分库时对数据进行切分

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在MySQL中分表分库时对数据进行切分

今天就跟大家聊聊有关怎么在MySQL中分表分库时对数据进行切分,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

数据库分布式核心内容无非就是数据切分(Sharding)以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。

数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平

1.垂直(纵向)切分

垂直切分常见有垂直分库和垂直分表两种。

1.1 垂直分库 

就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务

分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图:

怎么在MySQL中分表分库时对数据进行切分

将不同模块的数据表分库存储。模块间不相互关联查询

如果有,就需要通过数据冗余或者应层二次加工来解决。这种业务方法和数据结构最清晰。但若不能杜绝跨库关联查询,宣告此路不同

1.2 垂直分表 

是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。

怎么在MySQL中分表分库时对数据进行切分

垂直切分的优点:

  • 解决业务系统层面的耦合,业务清晰

  • 与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等

  • 高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈

缺点:

  • 部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度

  • 分布式事务处理复杂

  • 依然存在单表数据量过大的问题(需要水平切分)

2. 水平(横向)切分

当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平切分了。

水平切分分为库内分表和分库分表,是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果。如图所示: 

怎么在MySQL中分表分库时对数据进行切分

相对纵向切分这一将表分类的做法,此法是按表内每个字段的某个规则来将数据分散存储于不同的数据库(或不同的表),也就是按照数行来进行切分数据。

库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决。

水平切分的优点:

  • 不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力

  • 应用端改造较小,不需要拆分业务模块

缺点:

  • 跨分片的事务一致性难以保证

  • 跨库的join关联查询性能较差

  • 数据多次扩展难度和维护量极大

水平切分后同一张表会出现在多个数据库/表中,每个库/表的内容不同。几种典型的数据分片规则为:

2.1 根据数值范围

按照时间区间或ID区间来切分。例如:按日期将不同月甚至是日的数据分散到不同的库中;将userId为1~9999的记录分到第一个库,10000~20000的分到第二个库,以此类推。某种意义上,某些系统中使用的"冷热数据分离",将一些使用较少的历史数据迁移到其他库中,业务功能上只提供热点数据的查询,也是类似的实践。

这样的优点在于:

  • 单表大小可控

  • 天然便于水平扩展,后期如果想对整个分片集群扩容时,只需要添加节点即可,无需对其他分片的数据进行迁移

  • 使用分片字段进行范围查找时,连续分片可快速定位分片进行快速查询,有效避免跨分片查询的问题。

缺点:

  • 热点数据成为性能瓶颈。连续分片可能存在数据热点,例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询

怎么在MySQL中分表分库时对数据进行切分

2.2 根据数值取模

一般采用hash取模mod的切分方式,例如:将 Customer 表根据 cusno 字段切分到4个库中,余数为0的放到第一个库,余数为1的放到第二个库,以此类推。这样同一个用户的数据会分散到同一个库中,如果查询条件带有cusno字段,则可明确定位到相应库去查询。

优点:

  • 数据分片相对比较均匀,不容易出现热点和并发访问的瓶颈

缺点:

  • 后期分片集群扩容时,需要迁移旧的数据(使用一致性hash算法能较好的避免这个问题)

  • 容易面临跨分片查询的复杂问题。比如上例中,如果频繁用到的查询条件中不带cusno时,将会导致无法定位数据库,从而需要同时向4个库发起查询,再在内存中合并数据,取最小集返回给应用,分库反而成为拖累。

怎么在MySQL中分表分库时对数据进行切分

看完上述内容,你们对怎么在MySQL中分表分库时对数据进行切分有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在MySQL中分表分库时对数据进行切分

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在MySQL中分表分库时对数据进行切分

今天就跟大家聊聊有关怎么在MySQL中分表分库时对数据进行切分,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据库分布式核心内容无非就是数据切分(Sharding)以及切分后对数据的
2023-06-14

MySQL 分表分库怎么进行数据切分

关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数
2022-05-23

MySQL 要分表分库怎么进行数据切分?

数据库分布式核心内容无非就是数据切分(Sharding)以及切分后对数据的定位、整合。

在SpringMVC中使用Mybatis怎么实现对Mysql数据库进行分页查询

在SpringMVC中使用Mybatis怎么实现对Mysql数据库进行分页查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。第一步,搭建这个小案例,引入spring和mybti
2023-05-31

怎样进行mysql数据库的分析

怎样进行mysql数据库的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、数据库是什么?数据库是管理数据的一类软件。对数据的管理体现在两个方面,第一是描述数据,即一条
2023-06-22

怎么在python中对列表进行分片操作

今天就跟大家聊聊有关怎么在python中对列表进行分片操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyt
2023-06-14

如何在MySQL中对数据进行排序和分组

在MySQL中,可以使用ORDER BY子句对数据进行排序,使用GROUP BY子句对数据进行分组。对数据进行排序:SELECT * FROM table_name ORDER BY column_name ASC/DESC;ASC表示升序
如何在MySQL中对数据进行排序和分组
2024-03-06

在spring中使用mybatis实现对mysql数据库进行读写分离

这期内容当中小编将会给大家带来有关在spring中使用mybatis实现对mysql数据库进行读写分离,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言 在网站的用户达到一定规模后,数据库因为
2023-05-31

Mysql数据库中的分库分表怎么利用MyBatis来实现

本篇文章给大家分享的是有关Mysql数据库中的分库分表怎么利用MyBatis来实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MyBatis实现分表最简单步骤1、我们模拟用户
2023-05-31

如何在 Java 中对 quarter 进行数据分组?(java quarter如何进行数据分组)

在Java编程中,对数据进行分组是一项常见且重要的任务。而对于quarter(季度)这种时间相关的数据进行分组,更是在许多业务场景中经常遇到。本文将详细介绍在Java中如何进行quarter数据分组的方法。一、理解quarter的概念
如何在 Java 中对 quarter 进行数据分组?(java quarter如何进行数据分组)
Java2024-12-14

MyBatis中怎么进行数据库分页查询

在MyBatis中进行数据库分页查询,可以通过使用RowBounds对象或PageHelper插件来实现。使用RowBounds对象进行分页查询:List getUsers(SqlSession sqlSession, int
MyBatis中怎么进行数据库分页查询
2024-04-08

怎么在MySQL数据库中进行时间查询数据

这篇文章主要介绍“怎么在MySQL数据库中进行时间查询数据”,在日常操作中,相信很多人在怎么在MySQL数据库中进行时间查询数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在MySQL数据库中进行时间查
2023-05-25

编程热搜

目录