一、分表的类型
分表类型可以分为水平分表跟垂直分表
1.垂直分表
根据业务将常用的字段与不常用的字段进行划分, 将表字段拆分成多张表, 可用主键将多张表进行关联. 其实也就是我们常用的多表查询。适用于表字段过多的情况下使用。 垂直分表要注意字段的划分,防止出现过多的多表连接查询
2.水平分表
根据时间、字段属性等,将表数据拆分成多张表。水平分表需要注意主键不能重复,这时可以使用雪花id(雪花id会有服务器时间倒退问题)。适用于表数据量过大(例如mysql单表千万级数据)。 水平分表要注意划分的规则,防止出现查询时要跨多个表查询
二、实现方式
1.垂直分表
根据字段划分,例如用户信息表,可以将账号、密码、昵称这些常用字段设计成一张主表,其他的例如生日、性别等可以设计成另外一张副表,两张表通过主表的主键进行关联。
2.水平分表
水平分表的划分比较复杂,需要考虑表数据的属性跟业务,采取不同的方式进行划分。 一般可以采用一下几种方式进行划分:
-
hash算法 例如用户表,可以采取使用对uid进行hash后取模的方法来对用户表进行划分,在查询用户信息时,通过 对hash取模后既可以知道该用户是存储在哪个表中。该方法的缺点是扩展性较差,因为表数量改变后,对原先用户uid进行hash取模后,可能与原来的表下标不一致。如果要扩缩容,则需要对数据进行迁移。 假设用户表分为10个,a用户uid hash后为11,那么该用户位于的表则是1表。 如果增加用户表为20个,那么此时计算处理后得出该用户是位于11表,那么这时去11表中查询则无此用户。 此问题可通过一致性hash解决。blog.csdn.net/qq_34679704…
-
时间划分 例如日志或通话记录, 根据年份或月份等这种时间维度对表进行划分。例如一个月的数据就存在一张表中。
-
根据表中的字段分表 例如根据表中的地区字段进行分表,这样子在查询时直接根据地区字段的值去查询对应的表既可。
三、分表影响
由于我们的应用有可能是toB跟toC的。因此在某些情况下,可能需要牺牲某一端来满足另一端的需求来分表。 例如订单表。我们一般是可以根据用户id进行分表, 这样用户在查询自己的订单时不需要跨多表查询,可以显著提高c端用户的使用体验。但是在这种情况下,会导致b端的使用体验下降,可能需要引入数仓来优化b端。因此我们分表也需要根据实际的业务需求进行划分。