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

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

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

1.垂直(纵向)切分

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

1.1 垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图:

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

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

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

垂直切分的优点:

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

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

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

缺点:

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

分布式事务处理复杂

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

2. 水平(横向)切分

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

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

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

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

水平切分的优点:

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

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

缺点:

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

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

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

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

2.1 根据数值范围

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

这样的优点在于:

单表大小可控

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

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

缺点:

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

2.2 根据数值取模

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

优点:

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

缺点:

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

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

往期推荐

技术人具备“结构化思维”意味着什么?

Gradle 比 Maven 好为什么用的人少?

Kafka 提供哪些日志清理策略?

为什么ConcurrentHashMap的读操作不需要加锁?

Kafka 是怎么存储的?为什么速度那么快?

分享、点赞、在看,给个3连击呗!

mysql 分库分表 后怎么操作,MySQL要分表分库怎么进行数据切分?相关推荐

  1. wps连接mysql数据库增删改查_Python操作MySQL数据库实例详解【安装、连接、增删改查等】...

    本文实例讲述了python操作MySQL数据库.分享给大家供大家参考,具体如下: 1.安装 通过Python连接MySQL数据库有很多库,这里使用官方推荐的MySQL Connector/Python ...

  2. mysql驱动_python3 接口测试数据驱动之操作mysql数据库

    python3 接口测试数据驱动之操作mysql数据库 1.1 操作mysql数据库 1.1.1 python3操作mysql介绍 操作数据库是程序员常用的技能之一,mysql数据库是中小型项目的首选 ...

  3. mysql分页分表_mysql分表后 如何分页 (总共160个表1500万数据)

    mysql分表后,有160个表,有1500万数据,要怎么做分页列表? 之前是想用union all合并160个表的结果集..但直接卡的数据都出不来.. 请问这里应该怎么做分页,谢谢~~~ 回复讨论(解 ...

  4. MySQL 锁表后快速解决方法 及 锁表原因

    前几天同事在晚上上线的时候执行sql语句造成锁表,想总结一下以避免后续发生. (1) 遇到锁表快速解决办法 依次执行1-6步,运行第6步生成的语句即可. 如果特别着急,运行 1 2 6 步 以及第6步 ...

  5. php mysql两个表合并_php操作mysql两个数据库中表的数据同步

    题记: 我们开发当中经常会遇到,数据同步.比如将teaching数据库中area表的数据同步到study数据库中zone表中. 备注:这两个数据库不同,数据表名字也不同,但数据表的结构相同.不同表结构 ...

  6. unicode表_Python数据库操作 Mysql数据库表引擎与字符集#学习猿地

    # Mysql数据库表引擎与字符集 ![](./imgs/752951346A5F4E7EBDE362FA97107707.png) ### 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是 ...

  7. mysql存储过程 delete select insert_mysql常见操作语句,建表,增删改查

    用户操作 新建用户 grant 权限 on 数据库.表名 to 用户名@'访问地址' identified by "密码"; 新建一个可以远程访问数据库的用户 test, 密码:p ...

  8. python创建数据库表空间_Python 操作 mysql

    """python 操作mysql时,默认开启事务,必须在增删改之后 提交数据,才会真正对数据库发生变化,默认默认是回滚 提交数据: conn.commit() 回滚数据 ...

  9. mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享

    Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...

最新文章

  1. BufferedInputStream的read方法原理
  2. Python的注释及乱码 || 变量及类型
  3. Java实现用时间戳重命名上传的文件
  4. docker中创建RabbitMQ并在管理端界面打开
  5. c .net ajax,Asp.net mvc 2中使用Ajax的三种方式
  6. django-如何让首页不要报错
  7. 2019.10.15学习总结
  8. 自己的Matlab代码整理
  9. ansys linux安装包_ANSYS15.0 for Linux下载及安装教程 - 图文 -
  10. linux如何部署btsync同步?
  11. 随机森林随机回归预测_随机森林回归预测电子商务销售额
  12. html中增加一个播放器,从零实现一个自定义 HTML5 播放器
  13. IDEA报 java 找不到符号解决办法
  14. Django-登录注册
  15. 光棍.com市场推广策划书(爆笑)
  16. Company interview process
  17. 转载 | 年度盘点!Flink 社区全年的精华内容都在这里啦
  18. 怎么关闭win7计算机一键还原系统,Win7卸载一键还原功能后还会保留在开机启动菜单中怎么办...
  19. 笔记 | Java 虚拟机
  20. 2014年最新720多套Android源码2.0GB免费一次性打包下载

热门文章

  1. Microsoft Dynamics 365 之 味全食品 项目分享和Customer Engagement新特性分享
  2. mongo 主从数据不同步
  3. 写了个数码照片的自动分类整理工具
  4. C#中枚举类型enum的使用[转载]
  5. 邮件标题乱码问题解决一例
  6. flex 布局,flex-grow 宽度未等比放大问题解决办法
  7. 网页查看js源码汉字显示乱码问题解决
  8. 【vue开发问题-解决方法】(八)利用axios拦截器实现elementUI中加载动画,控制加载区域
  9. 【白皮书下载】2020年数字营销与商业增长白皮书.pdf
  10. 全球首发!惯性导航导论(剑桥大学)第六部分