分库分表Sharding

  • 前言
  • 什么是分库分表?
  • 使用场景
  • 分库分表的复杂性
  • 技术选型
  • demo

笔者个人博客
https://www.yuque.com/yinhe-dglmu

前言

笔者学年尚浅,目前接触的项目数据量不是很多,单表数据库最多的表数据量为562w,是一个学校的课程信息表,但是需要关联的表还是挺多的,如学籍表,如用户表等,按目前业务的发展来看,数据的增长量还是较快的。

目前的查询效率未到千万级别,再加上有缓存的配置,所以查询也不算慢。但是以防之后数据量过多导致查询效率低下,笔者学了一点分库分表的知识,与读者分享一下。

提醒:分库分表会给系统带来巨大的复杂性,不是万不得已建议不要提前使用。作为系统架构师可以让系统灵活性和可扩展性强,但是不要过度设计和超前设计。

什么是分库分表?

分库分表分为四种:水平分表、水平分库、垂直分表、垂直分库。


图中很好的表达了水平和垂直的含义,水平是拆分数据量,垂直是拆分字段(或表),很好理解。

使用场景

垂直分表:比如商品名称图片与商品描述,一般我们是存在一个表中,但商品描述相比名称图片又不是很重要,所以我们可以把描述字段分为另一个表,两个表以商品id相连。这样我们在查询时,名称图片查询时会少了描述字段,减少单表查询的磁盘I/O。

垂直分库:比如用户库与订单库,可以分在不同的数据库,增大单个数据库业务的吞吐量。操作用户系统就用户数据库,操作订单系统就订单数据库。

水平分表:单表数据量超过一定数量,查询操作会变的很慢。业内流传超过500w就考虑拆分,但其实只要不到1000w,也不会有很大变化。

水平分库:单数据库数据量太多,请求太多,将数据分散在不同数据库,减少对单个数据库的查询时间,提高数据库的承载量。

总结:
将业务数据进行解耦–垂直拆分
解决容量和性能压力–水平拆分

当然具体业务要具体分析,SQL调优缓存设置读写分离等提高的效果显著,并且成本很低,使用是优先考虑这些,不要为了分库分表而分库分表。

分库分表的复杂性

(1)跨库关联查询
在未拆分之前,我们只用简单的join就可以关联,但经过分库分表后两种表可能不在同一个数据库,那要怎么进行关联查询呢?

  • 字段冗余:把要关联的字段放入主表中,避免join操作。
  • 数据抽象:把各关联字段抽取出来,生成新的表。
  • 公共表:将基础表在每个数据库都生成一份。
  • 应用层组装:将基础数据查出来,通过应用程序计算组装。。

(2)分布式事务
单数据库用本地事务就可以搞定,使用多数据库就只能通过分布式事务解决了。
常用解决方案有:基于可靠消息(MQ)的解决方案、两阶段提交等。
(3)排序、分页、函数计算问题
在使用SQL时Order By、Limit等关键字需要特殊处理,一般来说采用分片的思想。
先在每个分片上执行相应的函数,然后将各个分片的结果集进行汇总和再次计算,最终得到结果(分库分表中间件一般会自己处理)
(4)分布式ID
如果是一个表,那可以id自增作为主键,但是分库分表之后就不行了,会出现id重复。常用的分布式ID解决方案有:UUID、雪花算法(SnowFlake)、美团Leaf等。

技术选型

笔者选择的中间件为
Sharding-JDBC
基于Sharding-JDBC的MySQL读写分离用起来真是很方便,而且ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目了
轻量级的Java框架,直接引入jar包即可。这意味着在项目中不需要做额外的安装软件,或者开启一部署某一个服务器框架。这对于学生机是很友好的,并且也是不收费的,适合自己的才是最好的。。。。。

但是缺点也是存在的,相比MyCat等有部署服务的框架,比如不便于观测和检测。
并且相比云数据库,基于中间件的分布式数据库,相对于单纯的中间件来说, 创建/管理方便、关键指标可视化/自动化告警、复杂运维。

demo

笔者分库分表还未真正应用,目前也只采用了水平分表的学习而已,但其实都差不多。简单展示一下。

操作方法与平时用的SpringBoot、MyBatisPlus那一套一样,只用配置文件application.propertie(yml)加一些配置即可,官网的配置很详细,需要配置自行去查考。

原表数据量562w

根据用户id取模2之后分为两个表,每个表280w

其他完全不影响我的增删改查。

分库分表Sharding相关推荐

  1. 数据库分库分表(sharding)系列

    数据库分库分表(sharding)系列 转载于:https://www.cnblogs.com/gotodsp/p/6517478.html

  2. 数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量...

    当团队对系统业务和数据库进行了细致的梳理,确定了切分方案后,接下来的问题就是如何去实现切分方案了,目前在sharding方面有不少的开源框架和产 品可供参考,同时很多团队也会选择自主开发实现,而不管是 ...

  3. 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...

  4. 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...

    为什么80%的码农都做不了架构师?>>>    版权声明:本文由本人撰写并发表于2012年9月份的<程序员>杂志,原文题目<一种支持自由规划的Sharding扩容方 ...

  5. 数据库分库分表(sharding)系列(四) 多数据源的事务处理

    系统经sharding改造之后,原来单一的数据库会演变成多个数据库,如何确保多数据源同时操作的原子性和一致性是不得不考虑的一个问题.总体上看,目前对于一个分布式系统的事务处理有三种方式:分布式事务.基 ...

  6. mysql sharding 方案_mysql sharding 方案 分库分表(sharding)系列(4)

    图1. Sharding实现层面与相关框架/产品 在DAO层实现 当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确 ...

  7. oracle 分表设计,oracle 分库分表(sharding)

    数据库Sharding的基本思想和切分策 关于垂直切分Vertical Sharding的粒度 数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 数据库分库分表(sharding) ...

  8. 分库分表需要考虑的问题及方案

    https://www.jianshu.com/p/32b3e91aa22c 分库分表的基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单 ...

  9. mysql分库分表方案之sharding-jdbc使用(非demo示例)

    选择开源核心组件的一个非常重要的考虑通常是社区活跃性,一旦项目团队无法进行自己后续维护和扩展的情况下更是如此. 关于分库分表和读写分离.主从 一般来说,需要分库分表的系统是流量比较大的,而且比较容易出 ...

最新文章

  1. PHP学习笔记-Cookie
  2. CentOS7开机启动图形界面的开启与关闭
  3. java学习之路--面试之多线程基础
  4. 组件库实战 | 教你如何设计Web世界中的表单验证
  5. 手把手教你创建容器服务Kubernetes集群
  6. java 7个数排序_JAVA基础(7)-数组的排序
  7. ggplot2作图详解:ggplot图形对象
  8. 求解偏微分方程开源有限元软件deal.II学习--Step 4
  9. 在苹果Mac中如何不用鼠标刪除文件?
  10. redis缓存穿透、缓存雪崩、缓存击穿详解
  11. intel wifi 5100agn linux驱动,intel5100agn驱动
  12. 网络操作系统发展历程
  13. Dreamweaver cs6运行出现错误16的解救方法
  14. 打印程序在计算机上的应用程序,什么是“后台打印程序子系统应用程序”(spoolsv.exe),以及为什么它在我的电脑上运行?...
  15. 算法---排序--希尔排序和快速排序
  16. 昵图网共享分下载代包下素材nipic呢图下载币图网设计素材下载
  17. 从输入url到页面加载完成中间都发生了什么?
  18. Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制
  19. NVIDIA NX刷机,配置深度学习环境
  20. Qt Creator 添加基于 JSON 的向导

热门文章

  1. 前端:简述表单提交前如何进行数据验证
  2. Turtlebot3 buger在仿真环境下建图导航
  3. 2.基于51单片机的蓝牙遥控器制作
  4. 华为入局商用市场:趋势使然,挑战颇多
  5. 花生日记涉传销,给了互联网企业什么启示
  6. 旅游行业“春来早”,走着瞧旅行云南踏青游正火爆
  7. 使用Python3将word文档和pdf电子书进行格式互转(兼容Windows/Linux)
  8. python微信公众号开发音乐功能_python利用微信公众号实现报警功能
  9. pytorch中的BatchNorm和LayerNorm
  10. 文件实现输入三行hello,实现在每个hello后面换行