Sharding分库分表(目录)

本文介绍了分库分表的需求背景,如互联网高并发场景,以及分片带来的好处和挑战。讨论了垂直分片和水平分片两种策略,强调了分片键选择的重要性。同时,详细阐述了路由机制、数据分布以及Sharding的优化方法,包括分片流程、核心问题和最佳实践建议。

Sharding分片的话, 只需要一句话,就可以完成分片. 有以下两种写法,与表名关系或与实现类关联.

数据源有ds0,ds1; test_user总共有6个表, ds0是test_user0,test_user1,test_user2,另外三个在ds1.  分片键是id, 默认是根据id的值求余,余数的下标即可表的下标.

ShardingConfig.addShardingBean("test_user",new ShardingBean("ds[0..1].test_user[0..5]", "id"));
ShardingConfig.addShardingBean(TestMyUser.class,new ShardingBean("ds[0..1].test_my_user[0..5]", "id"));


1.    背景:为什么需要分库分表
1.1    互联网需求    3
1.2    分库分表的好处    4
1.2.1    分库的好处    4
1.2.2    分表的好处    4
1.3    分片后带来的挑战    4
1.4    目标    5
1.5    什么样的表需要进行分库分表    5
1.6    电商系统哪些表需要作分库分表    5
2.    分库分表种类    5
2.1    垂直分片    5
2.2    水平分片    6
2.3    分库分表种类介绍    6
2.3.1    只分表    7
2.3.2    只分库    7
2.3.3    分库分表    7
3.    基本概念    7
3.1    基本表    7
3.2    实际表    7
3.3    表下标(表后缀)    7
3.4    关联表(主表与从表)    8
3.5    广播表    8
3.6    单表    8
3.7    数据节点    8
3.8    完整的数据节点    8
4.    路由/映射:如何找到要操作的表    8
4.1    实际表的分布种类    8
4.2    分片键    9
4.2.1    分库键    9
4.2.2    分表键    9
4.2.3    分片键的选择    9
4.2.4    实践—用userid作为分表键的好处    10
4.3    分片算法及分片函数    10
4.4    默认分片函数及分片的自动化    10
4.5    强制指定分片路由    10
4.6    路由到的库与表种类    11
4.6.1    一库一表    11
4.6.2    一库多表    11
4.6.3    多库多表    11
4.6.4    全库全表    11
4.6.5    只指定表    11
4.6.6    只指定库    11
4.7    如何分片    12
4.7.1    SQL触发的分片    12
4.7.2    面向对象触发的分片    12
4.7.3    SQL分片与面向对象分片的异同    12
4.8    分片优化与应该避免的问题    12
4.8.1    引起全域查询    12
4.8.2    插入的数据必须要找到归属    12
4.9    主键(分布式唯一ID)    12
5.    分片流程与Sharding核心问题    12
5.1    Bee (JDBC部分)的转换流程    12
5.2    Bee Sharding分片流程    13
5.3    Sharding核心问题    14
5.3.1    改写SQL    14
5.3.2    结果合并    14
5.3.3    排序    14
5.3.4    分页    14
5.3.5    查询Json    15
6.    Sharing最佳实践    15
6.1    表节点分布要有规律    15
6.2    配置简单方便    15
6.3    允许只有部分表分片    15
6.4    无侵入架构设计    15
6.5    分片透明化    15
6.6    示例    16
6.7    建议    16
7.    Bee对分片的优化    16
7.1    对一库一表的优化    16
7.2    对一库多表的分页查询的优化    16
7.3    对路由结果是只指定表的优化    17
7.4    采用约定方式,简化逻辑    17
 

提供的引用内容中未提及sharding分库分表场景下分页查询的解决方案和使用方法。通常,在Sharding分库分表场景下进行分页查询,有以下常见解决方案和使用方法: ### 解决方案 - **全局排序与合并**:在每个分片上执行分页查询,然后将结果汇总到应用端进行全局排序和合并。这种方式需要将多个分片的数据拉取到应用端,可能会带来较大的网络开销和内存压力,适用于数据量较小的情况。 - **局部排序与合并**:先在每个分片上进行局部排序和部分数据的获取,然后将这些局部结果汇总到应用端,再进行全局排序和最终的分页筛选。这种方式可以减少从分片拉取的数据量,但需要在应用端进行额外的处理。 - **预计算与缓存**:对于一些经常使用的分页查询,可以提前计算并缓存结果。当有新的数据插入或更新时,及时更新缓存。这种方式可以提高查询性能,但需要维护缓存的一致性。 ### 使用方法 以下是一个简单的使用Sharding-JDBC进行分页查询的Java代码示例: ```java import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration; import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration; import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration; import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class ShardingPaginationExample { public static void main(String[] args) throws SQLException { // 配置数据源 Map<String, DataSource> dataSourceMap = new HashMap<>(); // 这里需要根据实际情况配置数据源 // dataSourceMap.put("ds0", createDataSource("ds0")); // dataSourceMap.put("ds1", createDataSource("ds1")); // 配置分片规则 ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); // 配置表规则 TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..1}"); orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}")); orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_${order_id % 2}")); shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig); // 创建Sharding数据源 DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties()); // 执行分页查询 try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM t_order LIMIT ?, ?")) { int pageNum = 1; int pageSize = 10; int offset = (pageNum - 1) * pageSize; ps.setInt(1, offset); ps.setInt(2, pageSize); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { // 处理查询结果 System.out.println(rs.getInt("order_id")); } } } } // 这里需要实现创建数据源的方法 // private static DataSource createDataSource(String dataSourceName) { // // 创建数据源的具体逻辑 // } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值