- 1.1.1 单库垂直分表
- 1.1.2 多库垂直分表
当我们对原来的一张表做了分库的处理,如果某些业务系统的数据还是有一个非常快的增长速度,比如说还款数据库的还款历史表,数据量达到了几个亿,这个时候硬件限制导致的性能问题还是会出现,所以从这个角度来说垂直切分并没有从根本上解决单库单表数据量过大的问题。在这个时候,我们还需要对我们的数据做一个水平的切分。
- 1.2.1 单库水平分表
- 1.2.2 多库水平分表
一般我们说的分库分表都是跨库的分表。既然分库分表能够帮助我们解决性能的问题,那我们是不是马上动手去做,甚至在项目设计的时候就先给它分几个库呢?先冷静一下,我们来看一下分库分表会带来哪些问题,也就是我们前面说的分库分表之后带来的复杂性。
- 1.3.1 跨库关联查询
- 1.3.2 分布式事务
这个我会在分布式里讲解,目前暂且不提。
- 1.3.3 排序、翻页、函数计算问题
- 1.3.4 全局主键避重问题
Name | Length (Bytes) | Length (Hex Digits) | Contents |
time_low | 4 | 8 | integer giving the low 32 bits of the time |
time_mid | 2 | 4 | integer giving the middle 16 bits of the time |
time_hi_and_version | 2 | 4 | 4-bit "version" in the most significant bits, followed by the high 12 bits of the time |
clock_seq_hi_and_res clock_seq_low | 2 | 4 | 1-3 bit "variant" in the most significant bits, followed by the 13-15 bit clock sequence |
node | 6 | 12 | the 48-bit node id |
- 1、基于时间和 MAC 地址的 UUID
- 2、基于第一版却更安全的 DCE UUID
- 3、基于 MD5 散列算法的 UUID
- 4、基于随机数的 UUID——用的最多,JDK 里面是 4
- 5、基于 SHA1 散列算法的 UUID
- a)使用 41bit 作为毫秒数,可以使用 69 年
- b)10bit 作为机器的 ID(5bit 是数据中心,5bit 的机器 ID),支持 1024 个节点
- c)12bit 作为毫秒内的流水号(每个节点在每毫秒可以产生 4096 个 ID)
- d)最后还有一个符号位,永远是 0。
- 1.4.1 客户端 DAO 层
- 1)aplication.properties 定义多个数据源;
- 2)创建@TargetDataSource 注解;
- 3)创建 DynamicDataSource 继承 AbstractRoutingDataSource;
- 4)多数据源配置类 DynamicDataSourceConfig;
- 5)创建切面类 DataSourceAspect,对添加了@TargetDataSource 注解的类进行拦截设置数据源;
- 6)在启动类上自动装配数据源配置@Import({DynamicDataSourceConfig.class})
- 7)在 实 现 类 上 加 上 注 解 , 如 @TargetDataSource(name =DataSourceNames.SECOND),调用在 DAO 层实现的优势:不需要依赖 ORM 框架,即使替换了 ORM 框架也不受影响。实现简单(不需要解析 SQL 和路由规则),可以灵活地定制。
- 1.4.2 ORM 框架层
- 1.4.3 驱动层
- DataSource:数据源
- Connection:数据库连接
- Statement:语句对象
- ResultSet:结果集
- 1.4.4 代理层
- 1.4.5 数据库服务