分库分表 - Gukie/interview GitHub Wiki
- 分表,是为了减少单表的数据量,提高单表查询的效率。同时单表数据量少,join的时候,速度也会快一些
- 分库,是为了提供并发量。因为 每个库的连接数是有限制的,而且链接多了,I/O性能会下降
一般的
- 按照业务,进行垂直分库,使不同的业务数据处于不同的库中
- 当单表数据很大时,可以对该表进行分表
- 当一张表数据量很大的时候,然后趋势是会越来越大,就需要对改表进行: 分库分表了
对单表进行分库分表
- 数据如何散落到不同的库表中 假如表的主键是userId,希望分库数量是128个库,每个库有1024个表
- 1.1. 计算中间值. 中间值 = userId % (128*1024) Note: 如果userId是一个UUID,则可以对UserId进行Hash之后,再计算
- 1.2. 哪个库 库的下标 = 中间值 / 1024
- 1.3. 哪个表 表的下标 = 中间值 % 1024
-
维护一张主键跟库表,还有时间的 一张路由表
-
分页的化,可以通过路由表进行分页; 假设取前100条数据,如果没有路由表,可以通过以下手段:
- 3.1. 笨的: 每个库都取前100条,然后在应用层,对每个库取过来的数据进行汇总,二次排序,得到需要的100条数据
- 3.2. 灵活的: 采用Redis等大数据的框架,维护所有库中的主键信息;分页的时候,从这些主键信息中获取主键,然后再从DB中查找对应的数据