分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。按照一定的规则,将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。
分库分表的核心理念就是对数据进行切分(Sharding
),以及切分后如何对数据的快速定位与查询结果整合。而分库与分表都可以从:垂直
(纵向)和 水平
(横向)两种纬度进行切分。
1、垂直分库
按业务类型对表进行分类,像订单、支付、优惠券、积分等相应的表放在对应的数据库中。开发者不可以跨库直连别的业务数据库,想要其他业务数据,对应业务方可以提供 API
接口,这就是微服务的初始形态。
2、垂直分表
垂直分表
是基于数据表的列(字段)为依据切分的,是一种大表拆小表的模式。
3、水平分库
水平分库是把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,以此实现水平扩展,是一种常见的提升数据库性能的方式。
这种方案往往能解决单库存储量及性能瓶颈问题,但由于同一个表被分配在不同的数据库中,数据的访问需要额外的路由工作,因此系统的复杂度也被提升了。
4、水平分表
水平分表是在同一个数据库内,把一张大数据量的表按一定规则,切分成多个结构完全相同表,而每个表只存原表的一部分数据。
一定规则
1、取模算法
按字段取模(对hash结果取余数 (hash() mod N),N为数据库实例数或子表数量)是最为常见的一种切分方式。
2、范围限定算法
按照 时间区间
或 ID区间
来切分
分库分表工具
sharding-jdbc
(当当)TSharding
(蘑菇街)Atlas
(奇虎360)Cobar
(阿里巴巴)MyCAT
(基于Cobar)Oceanus
(58同城)Vitess
(谷歌)