水平分库分表与水平分表的思想相同,唯一不同的就是将这些拆分出来的表保存在不同的数据中。这也是很多大型互联网公司所选择的做法
某种意义上来讲,有些系统中使用的“冷热数据分离”(将一些使用较少的历史数据迁移到其他的数据库中。而在业务功能上,通常默认只提供热点数据的查询),也是类似的实践。
水平拆分是把单表按某个规则把数据分散到多个表的拆分方式,比如:把单表1亿数据按某个规则拆分,分别存储到10个相同结果的表,每个表的数据是1千万,拆分出来的表,可以分别放至到不同数据库中,即同时进行水平拆库操作
垂直拆分从业务上把订单下单数据与下单后处理数据分开,但对于订单销售数据,由于数据量仍然巨大,最大的订单销售相关表达到几十亿的数据量,如果遇到大型促销(如:店庆128、419、618、双十一等等),数据库TPS达到上限,单销售库单订单表仍然无法满足需求,还需要进一步进行拆分,在这里使用水平拆分策略。
订单分表是首先考虑的,分表的目标是保证每个数据表的数量保持在1000~5000万左右,在这个量级下,数据表的大小与性能是最理想的。
如果几十个分表都放到一个订单库里面,运行于单组服务器上,则受限于单组服务器的处理能力,数据库的TPS有限,所以需要考虑分库,把分表放到分库里面,减轻单库的压力,增加总的订单TPS。
水平拆分是指数据表行的拆分,表的行数超过几百万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。
水平拆分,有许多策略,例如,取模分表,时间维度分表,以及自定义的组织ID分表,用户ID分表等。在不同策略分表情况下,我们在根据各自的策略写入与读取。
我们再来考虑几个场景:
日志类型场景,你可以考虑年份月份分表,在日志记录表的名字中包含年和月的信息,例如log_2016_01,这样可以在已经没有插入操作的历史表上做频繁的查询操作,而不会干扰最新的当前表上插入操作。此外,你还可以考虑采用MyISAM或者Archive存储引擎,因为它们开销低,而且插入速度非常快。
组织类型场景,你可以考虑组织分表,不同的组织数据独立,而不应该在每张表中添加组织ID。这是一个不错的选择。