分表:垂直拆分、水平拆分
垂直拆分:根据业务将一个表拆分为多个表。
如:将经常和不常访问的字段拆分至不同的表中。由于与业务关系密切,目前的分库分表产品均使用水平拆分方式。
水平拆分:根据分片算法将一个表拆分为多个表。
如:按照ID的最后一位以3取余,尾数是1的放入第1个库(表),尾数是2的放入第2个库(表)等。

解决的问题:单纯的分表可以解决数据量过大导致检索变慢的问题。

分表无法解决过多并发请求访问同一个库,导致数据库响应变慢的问题。所以通常水平拆分都至少要采用分库的方式,用于一并解决大数据量和高并发的问题。这也是部分开源的分片数据库中间件只支持分库的原因。

分表不可替代的场景:最常见的分表需求是事务问题。
同在一个库则不需考虑分布式事务,善于使用同库不同表可有效避免分布式事务带来的麻烦。目前强一致性的分布式事务由于性能问题,导致使用起来并不一定比不分库分表快。目前采用最终一致性的柔性事务居多。分表的另一个存在的理由是,过多的数据库实例不利于运维管理。

综上所述,最佳实践是合理地配合使用分库+分表。

https://blog.csdn.net/u4110122855/article/details/50670503

MyBatis轻量分表落地方案:

分表需要解决的问题:(基于MyBatis来说明)
1. SQL解析
2. SQL改写
3. SQL执行
4. 结果合并

1. SQL解析
SQL语法树解析,为SQL改写做准备

2. SQL改写
按分片规则将 SQL 进行改写。
做为一个中间件产品,需要屏蔽分表的细节,到底分了多少个表,对使用者来说应该是透明的。所以使用者写出的 SQL 中的表是一个虚拟的表。
例如:有表 user_0, user_1,分片规则是 id%2
使用者写出的insert 语句:insert into user(id, name) values(1, '张三')
那么中间件需要将 SQL 改写为:insert into user_1(id, name) values(1, '张三')

改写出的 SQL 可能不止一条,例如:select * from user where id in (1, 2)
改写后的 SQL 应该是:select * from user_0 where id in (1, 2)
select * from user_1 where id in (1, 2)

3. SQL执行
MyBatis执行 SQL 时,最后是通过 PreparedStatementHandler#instantiateStatement(Connection) 来获取 Statement 的。它会从 BoundSql里面取需要执行的 sql 语句。
通过跟代码发现, BoundSql 是从 MappedStatement 中取出来的。
所以,我们 SQL 执行时,可以通过 MyBatis 的拦截器拦截 MappedStatement (即:Executor的query、update方法),然后改写 MappedStatement#getBoundSql()就可以了。

4. 结果合并
由于 SQL 改写后,我们需要执行的 SQL 不只一条,所以,当 SQL 有多条时,我们就需要将 SQL 执行的结果集合并出最终的结果。

基于MyBatis 的轻量分表实现:https://gitee.com/kkk001/mybatis-shard

分表需要解决的问题 基于MyBatis 的轻量分表落地方案相关推荐

  1. java 轻量数据库_DBTree是一个springboot2 + vue-element-template实现的轻量数据库表结构查看及管理工具...

    DBTree简介 DBTree是一个WEB版的轻量数据库表结构查看及管理工具,相比phpMyAdmin, DBTree只专注于方便开发查看表结构信息和 注释维护.通过树形展示库表结构,可以对表进行自定 ...

  2. Lifeograph 0.7.3发布 基于gtkmm的轻量电子日记本

    Lifeograph 0.7.3该版本标签进行分类.在一个单一的日记可记录多个主题.每个条目不同主题的支持.自动插入项目符号和检查框一起缩排的支持.创建和记录最后更改日期.喜爱和标签过滤条目.拖放的条 ...

  3. 基于resnet-18的轻量型车道检测研究

    基于resnet-18的轻量型车道检测研究 1.论文介绍以及实验 2.参考内容 论文2: Ultra Fast Structure-aware Deep Lane Detection 官方代码地址:h ...

  4. 改进Mahmood 等提出的基于椭圆曲线的轻量型的的认证协议

    改进Mahmood 等提出的基于椭圆曲线的轻量型的的认证协议 1.初始阶段 1.旧版 1.改进(无) 2. 注册阶段 1.旧版 2.改进 3. 用户间认证与建立临时会话密钥阶段 1.旧版 2.改进 4 ...

  5. 基于 MyBatis 手撸一个分表插件

    背景 事情是酱紫的,上级leader负责记录信息的业务,每日预估数据量是15万左右,所以引入sharding-jdbc做分表. 上级leader完成业务的开发后,走了一波自测,git push后,就忙 ...

  6. 基于腾讯轻量服务器安装Aria2+AriaNg+Nginx+File Brower 服务

    0x01应用简介 Aria2:是一个多平台轻量级,支持 HTTP.FTP.BitTorrent 等多协议.多来源的命令行下载工具. AriaNg:客户端启动器可以轻轻松松的管理你的Aria2下载器. ...

  7. 基于mybatis Interceptor的对 user_cache 表 address id_no 两个字段的加密解密;

    2019独角兽企业重金招聘Python工程师标准>>> 软件版本 idea 2017.2 mybatis:3.2.8 java version "1.8.0_51" ...

  8. 【分治法】解决中位数问题、格雷码问题以及分治法直接折半存在的问题讨论————武汉理工大学算法分析实验1

    AlgorithmExperiment 算法分析课实验 分治法的核心思想是将问题分为若干子问题去,使规模一步步缩小,最终分到一步就能得出结果.要注意每个子问题需要性质相同而且相互不重复. 采用分治法完 ...

  9. 美团最新!FastPillars:基于Pillar的最强3D检测落地方案

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[3D目标检测]技术交流群 后台回复[FastPillars]获取本文论文和代码!!! ...

最新文章

  1. struts1-2,springMVC原理基本对比(单例,多例)-servlet与filter区别
  2. 使用pip安装特定的软件包版本
  3. python爬虫能赚钱吗-在校大学生用python当爬虫一个月能赚3000吗?
  4. JavaScript对象根据自定义属性进行排序
  5. session很快失效_一口气说出 4 种分布式一致性 Session 实现方式,面试杠杠的~
  6. web 上传文件到linux没权限,Javaweb上传文件到Linux 没有读写权限
  7. CSS之Multi-columns的跨列
  8. 银联分账与银联代付_第三方分账系统到底有哪些作用?
  9. 插件translator_Zotero Jasminum 插件的更新记录
  10. 布袋除尘器过滤风速多少_滤筒除尘器的过滤风速如何选择?不会的进来看
  11. 搭建Jetbrains家族IDE授权服务器
  12. (转载)file_get_contents(php://input)
  13. 联盟链Quorum(基于raft共识)部署流程(三)- 部署基于Quorum链的区块链浏览器
  14. FreeRTOS移植到STM32
  15. Web前端-JavaScript--对象
  16. java菜鸟2:java指令
  17. OpenGL ES 基础概念
  18. 4 变量、作用域与内存
  19. 人工智能学习(九):贝叶斯网路——墨大版
  20. [网络工程师]-防火墙-防火墙体系

热门文章

  1. 文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归
  2. 图形卷积神经网络有多强大?一文让你熟练掌握GCN
  3. 机器学习算法工程师的自我修养
  4. 从安全视角对机器学习的部分思考
  5. 深度丨如果机器人三定律被打破,我们可以做些什么?
  6. 干货丨一文看懂人工智能、机器学习和深度学习的区别与联系
  7. IEEE Spectrum调查:AI 的 6 种最坏情况
  8. 英特尔史上最大收购!英特尔拟300亿美元收购GF,审批成关键!
  9. 这5个数学猜想最早在30年前提出,如今AI证明它们都错了
  10. 《自然》《科学》相继发文批评质疑:俄罗斯注册新冠疫苗“让众人面临风险”...