因为要解析 yml 配置文件,所以要引入
xml
<!-- XML序列化处理 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>如果 JPA 要使用,则设置:
yml
spring:
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:application-sharding-databases-tables.yml[!quote] 数据分片
数据分片 是指按照某个维度,将放在单一数据库中的数据分散地存放到多个数据库
数据分片的有效手段:
- 分库分表
- 主从架构读写分离
- 缓存
- NoSQL 数据库 :用来处理部分非关系型数据
- 数据归档 :对于历史数据,或不常用的数据,存储在独立的数据库中,减小主数据库的负担,确保只处理活跃数据
尽量避免跨库事务
什么时候需要数据分片 ?
- 单表行数不应该超过 500w 行
- 单表容量不应该超过 2 GB
- 单一数据库实例不应该超过 1TB
❤️ 分库分表
分库 :
- 垂直分库:DB【表 1,表 2】 -- 按照业务模块来拆分 --> DB1【表 1】,DB2【表 2】
- 水平分库【
使用更多】:DB【表 1】 -- 按照某个范围拆分 --> DB1【表 1】,DB2【表 2】
分表 :
- 垂直分表:表 1【10 字段,100w 数据】 -> 表 1【5 字段,100w 数据】,表 2【5 字段,100w 数据】
- 水平分表:表 1【10 字段,100w 数据】-> 表 1【10 字段,50w 数据】,表 2【10 字段,50w 数据】
分表策略
[!quote] 分表策略
分表策略 很重要 ! ! ! 策略用的不好,很影响性能,一定要结合业务场景来
- 哈希取模 :数据 id 对表的总数进行取模,余数决定数据落在哪个表
- 迁移麻烦 : 更改表数量后,需要对现有数据重新根据取模分配到对应的表
- 范围分表 :规定哪个范围的数据落在哪张表
- 无需数据迁移,易于管理
- 如果有某个范围的热点数据,会造成某张表的压力会很大
尽量使得同一条业务数据在同一个库 :比如我有一条购物数据(用户、商品订单、物流信息),这条购物数据查出来需要关联三张逻辑表(用户表、商品订单表、物流信息表),我们就要尽量使得这关联的三条数据在同一个库中:
- 使用 ShardingSphere 的绑定表来做,比如说这三张表都有 userId 这个字段,那这三张表就都使用 userId 作为分片键