MySQL分库分表

x33g5p2x  于9个月前 转载在 Mysql  
字(1.3k)|赞(0)|评价(0)|浏览(65)

随着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中分库分表比较复杂,所以能不分库分表,就不要分库分表。

相关文章

热门文章

更多