分库分表的孪生兄弟--不一样的分区篇(上)

上 篇
数据库分区,我觉得可以是一个“伟大”的数据库存储结构概念。如果说,一个编程者,并非一个职业DBA,那么除了表结构本身以外。分区,可能就是程序所需要关注的最靠底层的一个数据库的设计。例如前一篇提到的表空间,通常一个普通开发人员,就未必会去关注。但是分区概念,却不一样。它与应用场景结合更加紧密。比如,按时间、按地区、按类别分区,等等。
关于“伟大”一说,我猜测很多人是不赞同我这个观点的。原因是,我翻阅了各种市面上主流数据库的书籍,入门级的如《XX数据库从入门到删库跑路》,看起来高端的《XX数据库的技术内幕》,大部分书籍在介绍分区的内容的时候,都没有给很大的篇幅。甚至有好几本书上,就是这么简单的来了一句,对于一个很大的表,如果每次搜索都对全表进行扫描,会很耗时间,如果分区了之后,只要访问某个分区就会很快。
这难道不是一种误导么?分区真的就这么简单就讲清楚了吗?当然不是的。我给本篇起名为,不一样的分区篇。就是想说说我觉得的,分区的重要和伟大之处。
数据库为什么要有分区?引《孙子兵法》的第五篇-《兵势篇》孙子曰:凡治众如治寡,分数是也。斗众如斗寡,形名是也。说人话:凡是管理很大的数据库表就和管理小的数据库表一样,把它分区就好了;发挥好所有分区的功能就和发挥好其中一个分区的功能一样,他们能有一个统一的表名,可以使用统一的SQL语句来调度就好了。上面这段话,从分号隔开,可以分成上下两句。“伟大”是在于前半句还是后半句呢?显然是后半句。为啥?你把人分了容易,但是你要把茫茫多的分开的人,指挥得像一个人一样,这件事情就伟大了。
好,先讨论上半句。分治的思想
我常常遇到这样对话场景:
场景一:
对话者:“我们的数据太大了,我们分表吧!”
我:“为什么不用分区呢?”
对话者:“分区可以解决吗?”(请自己脑补不信任的眼神和质疑的语气)
场景二:
演讲者:“我们考虑用最先进的分库技术理念来解决这个瓶颈”。
众人投去了羡慕嫉妒而又膜拜的眼神,等待着大神讲出华丽又牛叉的方案。
我:“这里有个瓶颈,我们需要给这个表分区。”
众人轻视又不懈说,好的,那分一下吧。
无论分区、分表、分库。我们都需要围绕两个重要概念,一是隔离,一是瓶颈。在场景一种,为什么使用者要求分表呢?常见的情况中,例如,我这两个表,虽然结构一样,但是我一个是北京的数据,一个是上海的数据。如果北京的数据坏了,或者,我在对北京的数据进行奇奇怪怪的操作的时候,我需要对上海的数据完全没有影响,这就是所谓隔离。又比如,可能全国的数据放在一起量太大,交易量太多,出现了,磁盘、IO、网络、CPU等撑不住的情况,这就是所谓瓶颈。分区、分表、分库满足的是不同的隔离级别,以及解决不同的瓶颈。但是,他们的思想是非常接近的。
Sharding这个词(通常译为分片),可以说是自带着高贵的属性而出生的。每当与人讨论数据库技术,一聊到Sharding,就有一种自然而然的上档次的感觉。而且,它有很多好朋友,说出来各个华丽无比。比如分布式、集群、大数据等等。而Partition这个词,虽然从很多角度上来看,都很类似于Sharding,或者说它们都是从“分数是也”的理念而来。但是,就是感觉LOW。
为啥?按我的理解,因为Partition的实现时由DBMS来完成的,使用者没感觉。而Sharding往往需要程序,设计模式,乃至整个架构的设计围绕着它服务,十分有存在感。
他们在实际运用的时候,有区别吗?当然有!那么什么时候应该Sharding,什么时候应该Partition呢?我个人觉得Sharding的使用一定是有两种时候。第一种叫没钱的时候。第二种是Partition用到极致,也搞不定的时候。那么Partition 什么时候搞不定呢?又有两种,一种叫,当今世间上的硬件极限(买最贵的设备都抗不住)。第二种叫没钱的时候。
我们细细思量可以发现,分库分表这个套路在什么数据库上用的范围最广?或者你在什么地方见得会比较多?我觉得通常会指到同一个地方,叫Mysql。虽然它有各种各样华丽的马甲,比如阿里的OB,腾讯的TDSQL。为什么要用Mysql?开源免费!什么?InnoDB也很强大?如果明天ORACLE开源免费,你选型的时候还会选Mysql?不扯远了,Mysql为啥有那么多分库分表呢?来,我认为真相只有这一个。因为5.1版之前,Mysql不支持分区。这就是我说的第一种,叫没钱的时候。Oracle,Sql server, Db2,我通通买不起。好了,下一个免费的Mysql,做分库分表。
抛开玩笑的内容,Partition确实有解不掉的瓶颈需要使用分库分表的时候。但是,一个成熟的数据库使用者不应该滥用分库分表。这就是所谓DBA界分库铁律第一条,我非常赞同,叫做,能不分,就不分。然后,说说,第二种,Partition用到了极致的场景。
简单的说,我买了个Oracle,但是,我的系统TPS要1万。X86上,跑Oracle ,撑不住,怎么办?那么出路两条,第一条,EXADATA了解一下?IBM主机买一台?买不起,好,我们在Mysql ,或者X86上用Oracle做分库分表,这就是第二类里面的没钱的时候。还有一种,EXADATA,IBM 主机撑不住,所谓超越了地球上科技产品的极限,反正我没见过。
看到这里,是不是觉得扯淡内容,太多了。到底什么情况分区?什么情况分表?什么时候分库呢?还是那句话,第一看隔离级别,第二看瓶颈 。
两份结构一样的数据。但他属于两个客户,客户说,我有监管要求,我不能把数据和别人的数据放在一起,必须绝对的隔离,有严格的访问控制,别人根本不能有我的DB服务器的登陆权限。这就要求,数据在数据库层面就完全的隔开,就可以用分库。
如果说我是一个云提供商,两个客户都用我的客户,他们分别有自己的用户(SCHEMA),他们允许和他人共用数据库服务器,但是,严禁其他人使用归属于他的数据库表。那么这时候,可以分表。
如果,两份数据要求简单的隔离,相互处理不影响就可以了,有时候,我还希望一个用户一条sql,就能对比分析他们的差异。那这时候,分区就是一个极佳的选择。

(下)集中,会再阐述瓶颈问题。以及上面所说的后半句“形名是也”,用一句sql来操作不同分区里的数据的伟大之处。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值