分库分表

分库分表的方法一般就是垂直和水平拆分。

分库:针对请求量大,而不是数据量大。将大量请求拆分到不同的机器上,才能降低业务的压力。所以一般也是根据业务类型进行拆分。订单,用户,商品,日志,统计等进行拆分。

分表:是针对数据量大。一般来说业内500w或者2Gb,就需要进行拆分了。
这里补充一点,mysql单表的性能瓶颈是由机器决定的

  1. 垂直分表将表中字段拆分,依据是业务,前提你要对自己的系统业务很熟悉才行。比如用户表,常用的字段放在一个表,扩展信息不常用的放在另一个表。

  2. 水平拆分表可以根据表中字段的范围、取模、时间等。

整体的思路:
实在不能够优化了,单机的瓶颈达到了限制,那么最快最直接的就是升级机器。
接下去不行,那么开始考虑是分库还是分表。尽可能的改动小。
分库没有涉及因为机器性能够了,业务没有那么大。

看具体的业务,如果是请求数很多,那么是分库。这个时候分表效益不高,因为请求都是在一台服务器上,这个数据库的压力还是没有减少。(严格来说也不是说请求量大就是分库,首先是前端需要做负载,如果前端压力降下来了,数据库这边因为连接数等问题还是压力很大,就要考虑分库,看mysql的负载等其他直接反应负载高的参数)。
如何分库:根据数据在不同的库上,比如查询用户数据,是根据用户id进行查询的,那么根据用户id,hash取模出来的就在某一个库上,这样不同的用户就会分配到不同的数据库上进行操作。
可见这种操作是影响到了很多东西的。代码要经过大的改动,数据库的连接逻辑变了,所有涉及到操作用户的地方逻辑都变了,以下为总结的可能涉及到的问题 ↓

导致的问题

1、跨库join问题。比如查询用户相关的商品信息,不同的用户在不同的库上,那么如果是join查询就会失败。当然可以通过业务来避免,总之就是要处理好每个关系。
2、数据维度问题。商家的商品数据如果是根据商家的维度进行分库,那么用户查询某个分类商品的时候就会出现问题,这个情况就会出现跨库操作。
3、事务一致性问题。这个不用说了,不同的库,肯定会有这种问题。
4、分页排序难度增加。这些都涉及到垮库操作。

总结

所有出现的问题都是因为一个问题——跨库操作。因为业务逻辑是多个维度的。很多时候不可避免要进行垮库操作。
是否有好的解决方案呢??
网上找的:多维度存储。用到什么存什么(感觉是空间换时间)。

误区:分库是不同的数据在不同的库上,但是每个库中每个表的类型是一致的。

如果是因为请求表的数据量多导致慢,卡顿,考虑分表,将数据量进行拆分,比如很多日志统计类的数据,按照时间,月份星期,具体的看数据量,比如100w条数据一个表,如果一天就有那么多,就按照天来,然后定期备份,清理表。虽然理论上单库支持的表为20亿张表,对,是20亿~ 。
当然这个数据量还是和机器性能有关系,如果你机器性能io,cpu都能够支持mysql,那么不分库也没事。

代码实现思路

首先取表中某个字段进行计算——hash、取模、等其他方法,根据路由算法表绑定到具体的库或者表上。

参考链接:
https://blog.csdn.net/nuli888/article/details/52143065

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值