当我们设计的系统中单表的数据量过大的时候,用户查询的时候会明显感觉到速度慢,特别影响体验。
当然啦,我们可以通过优化SQL语句、优化表结构和索引来提高访问速度。但是当表的数据量到了一定程度,即使通过上述手段仍不能满足用户的需求。
这个时候我们就可以通过水平拆分表和垂直拆分表来实现单次查询数据量,从而提高查询速度。

水平拆分

*所谓水平拆分就是把一张表的数据拆分成多张表来存放,也就是表的行的拆分。

为了好理解,我们把表的数据量设置的小一点儿。
我们现在有一张产品表(product),该表有300W条数据。现在要拆分成4张表。
product_1、product_2、product_3 。
拆分规则:
ID%3+1=[1,2,3]
通过把这样的规则,可以把原本一张表的数据水平拆分到3张表里面。
假设现在我们要取ID为11的数据,我们只需要通过11%3+1=3,通过查询product_3即可获得ID为11的数据。

在插入的时候我们需要建立一张临时表来提供自增的ID。取到ID后通过上述的规则进行分表插入
水平拆分表之后,新表所有列、类型和原表应该完全相同,而且新表要去掉自增的属性。

另外:

部分业务逻辑也可以通过地区,年份等字段来进行归档拆分;
进行拆分后的表,只能满足部分查询的高效查询需求,这时我们就要在产品策划上,从界面上约束用户查询行为。比如我们是按年来进行归档拆分的,这个时候在页面设计上就约束用户必须要先选择年,然后才能进行查询;
在做分析或者统计时,由于是自己人的需求,多点等待其实是没关系的,并且并发很低,这个时候可以用union把所有表都组合成一张视图来进行查询,然后再进行查询;

垂直拆分

所谓垂直拆分是指表的列的拆分。

通常我们按以下原则进行垂直拆分:

把不常用的字段单独放在一张表;

把text,blob等大字段拆分出来放在附表中;

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

垂直拆分更多时候就应该在数据表设计之初就执行的步骤,然后查询的时候用jion关键起来即可;

参考:https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39326