MySQL分库分表

随着MySQL中的数据越来越多,查询一个数据会越来越慢,性能也就出现了瓶颈,所以出现了分库分表的策略。

本文以商城项目为例,讨论一下MySQL的分库分表。

一个商城项目中的数据库有以下两个核心表:
1、用户表
2、订单表

垂直分库

假如系统现在并发很大,用户访问用户表和订单表。我们可以采用分库的方法。

之前是一个数据库中 包含 用户表订单表,现在我们将将数据库分为两个库,一个库存放用户表,一个库存放订单表,然后将这两个库分别部署到两台机器上。

这样的话,之前所有的请求都落到一台机器上了,现在分到了两台机器上,可以支持更高的并发了。

垂直分库一般按照业务来分库。

垂直分库的缺点:
1、事务:之前两个表在一个库中,我们可以很简单的控制事务,但是现在两个表被放到了不同的机器上了,事务就不好控制了,只能通过分布式事务。

2、join:分库前,我们通过本地join就可以连接多个表,当分完库后,我们只能通过在代码中手动的连接了。

当然我们也可以通过冗余字段来解决。

分表

当一个表中的数据超过了 1000w行,主键对应的B+树的高度会很高,数据查询效率就会变慢,用户是不能忍受的,所以要分表。

分表有两种方式:
1、垂直分表
在这里插入图片描述
如上图所示,将一个表按照列分开,将一些不经常使用的字段给分离出去,这样的话,核心字段单独构成了一张表,虽然表的记录数没有少,但是对应的记录字段少了,一个page中能够放下更多的记录了,主键对应的B+树的高度就变低了,查询就快了。

但是对于非主键索引,对应的B+树是不会变的。因为非主键索引的B+树只会存储主键信息,不会存储非主键字段。

所以垂直分表只能够提升主键索引的查询速度,对于非主键索引,只能通过水平分表来提高。

水平分表

水平分表就是根据主键id将一个表分为多个表,将一个大表按照某个规则划分为多个小表。

之后查询数据,根据规则找到数据对应的小表,然后查找出对应的数据就可以了。

按照什么规则分呢?
1、hash取模
对id取hash值然后对小表的个数取模,得到对应的小表下标进行查询。

好处: 简单方便,数据分布均匀
坏处: 扩展性太差,如果新增或者删除表的话,之前的数据对应的下标就变了,需要搬运数据。

2、范围分表
比如对id范围进行分表,将id在1-10000的数据放入表1,id在10001-20000的数据放入表2

好处: 查找和扩容都很方便
坏处: 数据分布不均匀,有可能积压到某一个表上。

水平分表可以将表分到不同的数据库中,也可以将表分到同一个数据库中。

如果分到不同的数据库中,在水平分表的同时,也水平分库了,哈哈。

水平分表的优点:
数据查询速度变快

水平分表的缺点:
1、join查询,需要查询多个表的数据,然后合并,比较麻烦
2、排序,需要先查出多个表的单独排好序的数据,然后在排序。
3、主键自增问题,每个表中的主键不能重复,需要通过分布式ID来搞定。

总结起来,就是之前mysql都能帮我们直接搞定的事,现在我们需要在业务代码中自己手动统计每个表的数据,然后将其汇总。

MySQL中分库分表比较复杂,所以能不分库分表,就不要分库分表。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值