>>号外:往期面试题,每10篇为一个单位归置到本公众号菜单栏->聚合->面试题库,有需要的欢迎翻阅。

1. 为什么要实现拆分数据库?

单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。

就像《淘宝技术这十年》里面说到的,电商业务的数据量增长飞快,所以最开始的PHP+MySQL的架构已经不能满足实际要求了,于是淘宝想到的第一个办法就是把MySQL替换成Oracle。但是没过了多久,在08年前后,单节点的Oracle数据库也不好用了,于是淘宝终于告别了单节点数据库,开始拆分数据库。从一个节点,变成多个节点。

拆分数据库是有讲究的,比如说拆分方法有两种:垂直切分和水平切分。那你是先水平切分还是垂直切分呢?顺序无所谓?不,顺序有所谓,次序绝对不能错:先水平切分,然后垂直切分。

2. 什么是垂直切分?

垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。

比如说一个新零售的电商数据库,我们可以把跟商品相关的数据表拆分成一个数据库,然后在这些数据表的基础之上,构建出商品系统。比如用JAVA或者PHP语言,创建出一个商城系统。然后把跟进销存相关的数据表拆分到另外一个数据库上,再用程序构建出仓库系统。

垂直切分解决了什么问题

垂直切分可以降低单节点数据库的负载。原来所有数据表都放在一个数据库节点上,无疑所有的读写请求也都发到这个MySQL上面,所以数据库的负载太高。如果把一个节点的数据库拆分成多个MySQL数据库,这样就可以有效的降低每个MySQL数据库的负载。

垂直切分不能解决什么问题

垂直切分不能解决的是缩表,比如说商品表无论划分给哪个数据库节点,商品表的记录还是那么多,不管你把数据库垂直拆分的有多细致,每个数据表里面的数据量是没有变化的。

MySQL单表记录超过2000万,读写性能会下降的很快,因此说垂直切分并不能起到缩表的效果。

3. 什么是水平切分?

水平切分是按照某个字段的某种规则,把数据切分到多张数据表。一张数据表化整为零,拆分成多张数据表,这样就可以起到缩表的效果了。

很多人,都会水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上。其实水平切分出来的数据表也可以保存在一个MySQL节点上面。不是水平切分一定需要多个MySQL节点。为什么这么说呢?

许多人不知道MySQL自带一种数据分区的技术,可以把一张表的数据,按照特殊规则,切分存储在不同的目录下。如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术,把一张表的数据切分存储在多个硬盘上。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO。

1)水平切分的用途

水平切分可以把数据切分到多张数据表,可以起到缩表的作用。

但是也不是所有的数据表都要做水平切分。数据量较大的数据表才需要做数据切分,比如说电商系统中的,用户表、商品表、产品表、地址表、订单表等等。有些数据表就不需要切分,因为数据量不多,比如说品牌表、供货商表、仓库表,这些都是不需要切分的。

2)水平切分的缺点

不同数据表的切分规则并不一致,要根据实际业务来确定。所以我们在选择数据库中间件产品的时候,就要选择切分规则丰富的产品。常见的数据库中间件有:MyCat、Atlas、ProxySQL等等。有些人觉得MyCat是Java语言开发的,就怀疑MyCat运行效率。其实数据库中间件的作用相当于SQL语句的路由器。你家路由器硬件配置不怎么高,但是不影响你享用百兆宽带。MyCat也是一个道理,它仅仅是起到SQL语句转发的作用,并不会实际执行SQL语句。我推荐使用MyCat最主要的原因是它自带了非常多的数据切分规则,我们可以按照主键求模切分数据,可以按照主键范围切分数据,还可以按照日期切分数据等等。因此说,为了满足业务的需要,MyCat目前来说算是非常不错的中间件产品。

水平切分的另一个缺点就是扩容比较麻烦,日积月累,分片迟早有不够用的时候。这时候不是首先选择增加新的集群分片。因为一个MySQL分片,需要4~8个MySQL节点(最小规模),增加一个分片的投入成本是很高的。所以正确的做法是做冷热数据分离,定期对分片中的数据归档。把过期的业务数据,从分片中转移到归档库。目前来说数据压缩比最高的MySQL引擎是TokuDB,而且带着事物的写入速度是InnoDB引擎的6-14倍。用TokuDB作为归档数据库最适合不过。

4. 为什么先做水平切分,后作垂直切分?

随着数据量的增加,最先应该做的是数据分片,利用多块硬盘来增大数据IO能力和存储空间,这么做的成本是最低的。几块硬盘的钱就能收获不错的IO性能。

进入到下一个阶段,数据量继续增大,这时候我们应该把数据切分到多个MySQL节点上,用MyCat管理数据切分。当然还要做数据的读写分离等等,这里不展开讨论。在后台做水平切分的同时,业务系统也可以引入负载均衡、分布式架构等等。理论上,使用了冷热数据分离之后,水平切分这种方式可以继续维持很长一段时间,数据量再大也不怕,定期归档就好了。

数据库到了水平切分的阶段,数据量的增加已经不是更改架构设计的主要原因了。反而这个阶段业务系统承受不住了,如果再不对系统做模块拆分,业务系统也撑不下去了,所以按照模块和业务,把一个系统拆分成若干子系统。若干子系统之间,数据相对独立。比如淘宝不会跟支付支付宝分享全部数据,共享同一套数据表,这也影响各自业务的发展。所以就要弄垂直切分了,把数据表归类,拆分成若干个数据库系统。

讲到这里,你仔细想想。如果过早的对数据库做了垂直切分,势必要重新构建若干独立的业务系统,工作量太巨大。水平切分并不需要业务系统做大幅度的修改,因此说应该先从水平切分开始做。

作者:神思者

imooc.com/article/288363

往期精选  点击标题可跳转

【001期】为什么Java不支持运算符重载?

【002期】说说 hashcode() 和 equals() 的作用、区别、联系?

【003期】Java 中 Class.forName 和 ClassLoader 到底有啥区别?

【004期】你知道为什么HashMap是线程不安全的吗?

【005期】了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?应对措施是什么?

【006期】面试官问:说一说 HashMap 中的容量与扩容如何实现?

【007期】面试中经常问哪些设计模式?懒汉,恶汉,双重校验锁,枚举和静态内部类

【008期】为什么需要消息队列?使用消息队列有什么好处?

【009期】如何正确访问 Redis 中的海量数据?服务才不会挂掉!

【010期】面试官问:你能说说 SOA 架构和微服务架构的区别么?

点个赞,就知道你“在看”!

【011期】说一说为什么要拆分数据库,都有哪些方法?相关推荐

  1. 【024期】说说为什么要拆分数据库?有哪些方法?

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  2. 【34期】谈谈为什么要拆分数据库?有哪些方法?

    点击上方蓝色"java大数据修炼之道", 选择"设为星标" 每晚九点: 技术干货

  3. 2019计算机开机号003期,2019年011期福彩中心开机号(附汇总)

    001期开机号:819--试机号:985-- 开奖号:644→总结:开机号无下试机号无下 002期开机号:579--试机号:227-- 开奖号:272→总结:开机号下7试机号下27 003期开机号:0 ...

  4. python 列表多行_Python Pandas list列表数据列拆分成多行的方法实现

    1.实现的效果 示例代码: df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}) df Out[458]: A B 0 1 [1, 2] 1 2 [1, 2] ...

  5. oracle中有类似split的方法么,Oracle 实现拆分列数据的split()方法

    'one,two,three,four,five,six,seven,eight,nine,zero'as source_string from dual),-- 统计字符串中子串的个数,用 ','来 ...

  6. ai中如何插入签名_技巧不求人167期 Excel如何打印到1页纸的2种方法 Excel如何插入手写签名...

    嗨,大家好,上期我们介绍了Excel如何制作漂亮的文件盒侧标签.今天我们继续分享,在日常excel编辑过程中,常常会遇到因为数列或者行数过多导致内容不全,根本就不能打印在一张纸上面,假如分开打印到两张 ...

  7. 服务拆分理论和原理及方法

    服务拆分理论和原理及方法 谈到微服务,议论的最多,吵架的最多的就是服务拆分问题,服务拆分是否合理直接影响到微服务架构的复杂性.稳定性以及可扩展性.然而并没有任何一本书籍或者规范来介绍如何拆分服务,那么 ...

  8. js拆字_分图程序 _拆分书法字体_拆分石刻碑文_拆分黄庭经碑文_使用方法

    js拆字_分图程序 _拆分书法字体_拆分石刻碑文_拆分黄庭经碑文_使用方法 前言 javascript古籍文字拆分图片程序使用方法 古籍文字拆分图片程序 拆分手写字 能拆分雪碧图 能拆分透明png图 ...

  9. pandas中将每一行数据拆分成多行的方法

    一.应用场景 用pandas处理数据时,我们经常会遇到将一行拆分成多行,或者将一列拆分成多列的方法,今天主要讲第一个问题,第二个问题下次讲.举个例子:我现有的数据如下: 其中TrainData是我需要 ...

最新文章

  1. Web APP开发技巧总结(转)
  2. OC之ARC环境中的循环strong问题
  3. android listpreference 自定义,Android ListPreference的用法一
  4. 我从创建具有仅仅一年编码经验的视频游戏中学到了什么
  5. Node有什么特点?
  6. Spring实现Controller中方法参数校验
  7. keil c51注册机2032
  8. linux如何设置默认浏览器,如何从命令行设置默认浏览器?
  9. 大学生生活中的三大痛点
  10. Jetson Xavier NX系统安装至 nvme 硬盘
  11. DDNS的NAT穿越问题
  12. solidworks显示无法连接到服务器,SOLIDWORKS Electrical解决方法:无法连接协同服务器...
  13. 数据预测算法-指数平滑法-2
  14. Python实战——1_1.网页制作
  15. 网景创始人:软件应用无所不在 正吞噬整个世界
  16. Unable to access ‘https://github.com/**/**/‘: OpenSSL SSL_read: Connection was aborted, errno 10053
  17. python爬虫之云片网国内短信接口爬取
  18. 七大原则+23种设计模式
  19. python收音机_FM收音机入门,以及Python实现FM调制解调
  20. Ubuntu Budgie 18.04 软件环境配置与CUDA 9.1、cuDNN7.1、Pytorch安装

热门文章

  1. 刘永好、冯仑、翁国亮顶力合作进军医疗健康产业
  2. 专业级mac数据恢复软件—Easyrecovery
  3. FPGA同步和异步电路
  4. Android获取电池电量的三种方法
  5. 天猫精灵设备联动,指纹锁开门,打开客厅的灯
  6. SecureCRT 快捷键
  7. 前端开发必备技能知识笔记-二级目录的配置
  8. Could not publish to the server tomcat version 8.5 requires java se7 or later......
  9. 服务器坏了怎么维修,服务器怎么老坏,坏了也没人修???
  10. NYOJ-1236-挑战密室