目前很多互联网都存在单表数据量过大的问题,且一些调查问卷的系统,或者数据源都是一些以Excel表上传的数据,而一般作为刚工作的小伙伴,对于表的设计只存在于初步阶段,将Excel上的每个sheet页的每个列按部就班的放在了一个表的每个字段上,从而导致了一个表存在大量的字段和数据。

1、水平拆分

水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。

对于单表的数据量过大达到百万级或千万级别的数据,每次的查询很慢很慢,即使你加了索引也达不到业务想要的结果,所以我们应该将表进行结构化的设计

mysql分组横向显示 mysql横向拆分_java

例如 : 登陆表,假如账号存在数量为100亿,那么我们可以将这个表拆分为100份,然后给每个表都起一个别名,而起别名的方式 我们通常采用 “取模”的方式,例如 你的id是123456789,那么我们根据拆分表的数量作为取模的基数 , id%100 这样我们将123456789 进行计算得出后 ,结果为 id89, 所以 我们将这条数据放在登录89表中,另外部分业务逻辑也可以通过 年份,地区来区分,当我们做了这些约束后, 我们必须约束用户在查询的时候先去选择 约束的字段,比如 年、月、地区 然后再进行查询,在做视图的时候我们可以通过利用union把所有表都组合成一个视图来查询

2、垂直拆分

垂直拆分就是把一张“列”比较多的表,进行拆分成多个表,把大字段拆分到另一个表,与该表形成一对一的关系

垂直拆分的优点

**1、**可以使数据变小,在查询的时候减少I/O的次数,每次查询时读取的block(数据块)就会少,磁盘按页存储,在B+Tree 叶节点一页可以放更多的行数据,数据小,读一个范围的数据可能一页一次I/O就可以了

**2、**可以达到最大化利用缓存的目的,具体在垂直拆分的时候可以将不常变的字段放在一起,将常改变的数据放在一起(更新让缓存无效化——》 可以参考 redis和mysql保持一致性的方式,懒加载和立即加载,双删的效果)

**3、**数据维护简单

mysql分组横向显示 mysql横向拆分_java_02


总结

1、我们将不常改变的字段数据放在一起,将常改变的数据放在一起方便维护

2、把text和blob等大字段拆分出来放在一个附表

3、经常组合查询的列放在一张表中

例如学生答题表tt:有如下字段:

Id name 分数 题目 回答

其中题目和回答是比较大的字段,id name 分数比较小。

如果我们只想查询id为8的学生的分数:select 分数 from tt where id = 8;虽然知识查询分数,但是题目和回答这两个大字段也是要被扫描的,很消耗性能。但是我们只关心分数,并不想查询题目和回答。这就可以使用垂直分割。我们可以把题目单独放到一张表中,通过id与tt表建立一对一的关系,同样将回答单独放到一张表中。这样我们插叙tt中的分数的时候就不会扫描题目和回答了。