随着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中分库分表比较复杂,所以能不分库分表,就不要分库分表。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_40276626/article/details/120688814
内容来源于网络,如有侵权,请联系作者删除!