挑灯夜读——数据库(分库分表)

26 篇文章 0 订阅
11 篇文章 0 订阅

为什么要分库分表

  • 虽然没有经历过BAT那种高并发的业务场景,但是不断实现这些业务场景下的解决方式是我们一直在追求的事,那么我们为什么要进行分库分表呢?

1、业务方向,如果不分库的话,在多个请求下,会带来数据库连接数的迅速递增(连接资源不足)和IO的频率增大(影响性能),那么这样宝贵的资源,势必要将其使用量降到最低。
2、数据方向,sql查询语句时,即使使用了索引也会很耗时,影响cpu性能。

  • 从上面可以看到,在实际的业务中,很难直接使用一个库一个表来存放我们的数据,这样势必会导致整体性能下降。
  • 那么我们就从以下两个方向来进行优化,如下:

垂直方向

  • 何为垂直方向:也就是我们的数据库按照垂直的方向来优化。比如,我们的数据库是由字段来组成的,只有将多个字段分割,不就使我们的数据表的数据量降下来了嘛。

1、单库

  • 也就是在传统的知识学习中,我们普遍使用单库来完成业务数据的存储,如下图所示:

在这里插入图片描述

  • 此时的数据库方案就是:一个数据库包含了多张业务表。那么自然数据请求和写都在这一个数据库中进行操作。

2、分表

  • 在系统上线后,用户的数量增多,此时的访问频率不断增加,单个数据库无法承受这种被不断访问的情况,决定多分几个表

仔细一想,当用户字段被ALTER不断添加后,字段可能就会增加到几十上百,那么这样的字段存储的数据还是很大的。

  • 将用户表中的字段分为:用户基本表和用户扩展表

  • 其中用户基本表存储的是用户的重要信息,包括:姓名、年龄、密码、手机号等。这些字段的访问频率极大。

  • 另外的用户扩展表存储着用户的次要信息,包括:爱好、学校、家庭地址等。这些字段的访问频率明显小于上面的重要信息。

  • 当然根据访问频率也可以将一个表的字段分为:高访问频率字段和低访问频率字段两种表。

3、分库

  • 当然,随着业务量的不断增加,公司的业务拓展的越来越广,此时我们的数据库存储的用户表,可能来自中国、日本、韩国、美国等各个国家的用户,那么简单的使用分表将使表的数量难以估计。
  • 这时候,使用分库来进行优化的效果,明显大于分表。而分库的意义就为:将根据业务功能,划分不同的领域。把领域相同的数据存储在一个数据库中。这样就产生了以下的效果。

在这里插入图片描述

  • 将用户、产品、物流、订单相关的表,从原来的一个数据库,拆分为单独的用户库、产品库、物流库和订单库,一共四个数据库。

4、分表分库

  • 综上所示,分表分库也就是按照业务,将数据不仅分表而且分库。

例如:
年度消费的数据,先使用年份进行分库,如下:
2019年库、2020年库、2021年库
再在各个库中进行分表,如下:
每个年库下,分为月份表,1月份表…12月份表

  • 这样进行分库分表后,数据的查询就快速多了。当然还有很多分库分表的例子,比如分库通过地域划分:华东、华西、华南、华北、华中。然后每个地区再分为省份表,这样就更方便了。

水平方向

  • 水平方向,也就是在数据库的视图中,水平切割数据,就变成了对数据的操作。下面我们细聊:

1、单库

  • 和垂直方向一样,也就是没有做任何的优化的单个库。

2、主从读写分离

  • 这样的思想,在我们的分布式中经常使用,也就是将为了解决数据库连接的数量受限,每次读写请求都要使用一个连接数,这样会很耗费我们的资源。
  • 我们就可以复制一个一样的数据库,形成两个数据库。
  • 为了解决这样的问题就引入了读库和写库分开的思想!!!

当然将读写库分开的方式是,使用异步同步数据,这样的异步发起者是我们的主数据库,也就是专门负责写的数据库,我们命名为master。另一个专门负责读的数据库,我们取名为从数据库,命名为slave。

  • 也就是所有的读数据都指向主库。一旦写数据完成之后,立马异步同步给从库。这样所有的读数据请求,就能及时从从库中获取到数据了。

  • 但是出现了一个问题:如果用户量确实有些大,master挂了,升级slave为master后,所有的读写请求都会指向master(原来的slave)库。

  • 这时我们就可以使用一主两从,或者一主多从,master挂了,一个slave升级,还有一个slave负责读。

3、分库

  • 上面的读写分离确实解决了读的请求大于写的请求时,导致的master抗不住的情况。但是写的请求非常大时,一个master就无法曾受如此大的压力了。
  • 我们便可以将数据库分为多个库

4、分表

  • 例如用户库中用户表数据极大,到了几千万用户信息。我们就可以使用分库将用户库拆分为多个一样的表,只是存储的用户不同,可能是id:0-1000000,id:1000001-2000000…
  • 分表是在分库的更细化下进行的优化操作。

5、分库分表

  • 综合以上的操作,对用户的数据进行分库分表操作。
  • 并且在后期的定位操作中,可以使用取模的方式来决定此时需要查询的库和查询的表。

总结

  • 垂直方向(也就是业务方向)

  • 水平方向(也就是数据方向)

  • 在水平方向上,分库和分表的作用,是由一些区别的,不能混淆。

    • 分库:是为了解决数据库连接的数量不足问题,和磁盘IO性能瓶颈问题
    • 分表:是为了解决单数据表量太大,sql查询数据时,即使走了索引也非常耗时。也可以解决cpu资源问题
    • 分库分表:可以解决数据库连接资源不足、磁盘IO性能瓶颈、走索引也耗时和消耗CPU性能问题
  • 【注】:本篇文章思路参考公众号:苏三说技术,如果违法,请联系我,立马删除。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米店不卖你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值