目录
什么是分库分表
分库分表是一种数据库优化策略,主要去解决数据不断增长访问压力增大带来的单个数据库或者单个表性能瓶颈问题。通过分库分表,来提升系统的读写性能,扩展性和可用性。
分库分表的形式:
- 分库
- 分表
- 分库有分表
分库和分表都有两种模式:
分库的两种模式:
- 垂直分库:电商数据库拆分为用户、订单、商品、交易等数据库。
- 水平分库:用户数据库,拆分为多个,比如User_DB_0 - x。
分表的两种模式:
- 垂直分表:将数据库表按照业务维度进行拆分,将不常用的信息放到一个扩展表。
- 水平分表:将用户表水平拆分,展现形式就是 User_Table_0 - x。
什么情况下分库分表:
1.什么情况下分表:
数据量过大或者数据库对应的磁盘文件过大
2.什么情况下分库:
数据库连接不够用
3.什么情况下分库又分表:
高并发写入或查询。
数据量巨大场景。
数据库分库分表框架 ShardingSphere
先看一下我们的数据库中的表
分片键:用于将数据库(表)水平拆分的数据库字段。
分片键(Sharding Key)是整个分片策略的核心,它是一个或一组字段,用于决定数据如何被均匀且有效地分布到各个分片(子表或子库)中。
分片键的选择直接影响到数据在分布式环境下的存储、查询、更新和删除的效率,以及系统的扩展性和数据的一致性。
分片键的选择:
- 访问频率:选择分片键应考虑数据的访问频率。将经常访问的数据放在同一个分片上,可以提高查询性能和降低跨分片查询的开销。
- 数据均匀性:分片键应该保证数据的均匀分布在各个分片上,避免出现热点数据集中在某个分片上的情况。
- 数据不可变:一旦选择了分片键,它应该是不可变的,不能随着业务的变化而频繁修改。
我们分t_user表,选择username作为分偏键。
Q:业务CURD如何找到正确的t_user_xx表来操作呢?
A:我们对分偏键进行分片算法,将其通过分片算法来得到确定的xx。
我们分了16个用户表。
1.导入依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.3.2</version>
</dependency>
2.定义分片规则-application.yaml:
spring:
datasource:
# ShardingSphere 对 Driver 自定义,实现分库分表等隐藏逻辑
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
# ShardingSphere 配置文件路径
url: jdbc:shardingsphere:classpath:shardingsphere-config.yaml
3.shardingsphere-config.yaml:
# 数据源集合
dataSources:
ds_0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://127.0.0.1:3306/link?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: root
password: root
rules:
- !SHARDING
tables:
t_user:
# 真实数据节点,比如数据库源以及数据库在数据库中真实存在的
actualDataNodes: ds_0.t_user_${0..15}
# 分表策略
tableStrategy:
# 用于单分片键的标准分片场景
standard:
# 分片键
shardingColumn: username
# 分片算法,对应 rules[0].shardingAlgorithms
shardingAlgorithmName: user_table_hash_mod
# 分片算法
shardingAlgorithms:
# 数据表分片算法
user_table_hash_mod:
# 根据分片键 Hash 分片
type: HASH_MOD
# 分片数量
props:
sharding-count: 16
# 展现逻辑 SQL & 真实 SQL
props:
sql-show: true
上面我们分表用的是哈希取模的分片算法,它会将分偏键用哈希函数进行计算,生成哈希值。哈希函数能够将输入空间映射到一个固定范围,且分布相对均匀。
将哈希值对预先设定好的分片总数进行取模运算(hash(key) % number_of_shards
)。取模的结果将决定数据归属于哪一个分片。
ShardingSphere 数据分片核心概念
我们数据库中其实没有t_user表,t_user是一个逻辑表,虚拟存在的
我们在实体类上
t_user表会和我们真实存在的表做一层映射,我们执行sql语句的话,也会有逻辑SQL和真实的SQL。逻辑sql,查询的是t_user表,而真实的sql查询的是真实存在的表