Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

分库分表的使用 #330

Open
AHLIRL opened this issue Aug 6, 2022 · 9 comments
Open

分库分表的使用 #330

AHLIRL opened this issue Aug 6, 2022 · 9 comments
Labels

Comments

@AHLIRL
Copy link

AHLIRL commented Aug 6, 2022

分片分表查询能不能写个更简单的示例, DEMO里琢磨半天还是不太理解.
特别是路由那一块, 整不明白. 我看有ShardingQuery这个方法, 就是不知道怎么调用的

@shuxinqin
Copy link
Owner

shuxinqin commented Aug 6, 2022

  1. 框架不知道有哪些分表,所以你要实现 IShardingRoute.GetTables() 方法返回所有的分表信息(分表信息包括表名,表所在的库信息【IDbContextProviderFactory 对象】)。
  2. 框架将路由策略做了抽象,所以路由到哪些表需要自己实现(按时序,取模还是其他算法自行实现),目前支持(==,<=,>=,!=,<,>)等操作符路由,比如假设根据 CreateTime 字段分表,如果类似 Where(a => a.CreateTime== 2020-10-10 ) 查询,怎么定位到哪些表呢?所以你需要实现 IShardingRoute.GetStrategy(MemberInfo member) 根据分片字段获取路由策略接口 IRoutingStrategy,实现自己(==,<=,>=,!=,<,>)等操作符的路由策略(IRoutingStrategy)。
  3. 假设根据时间分表(CreateTime),查询时又根据 CreateTime 排序(如 OrderBy(a => a.CreateTime)),因为数据储存是按时间段有序存储的,所以针对这种情况下的查询可以优化一下避免无谓的查询,因此你需要实现 IShardingRoute.SortTables() 方法,对定位到的表进行一次重排,以提升查询效率(可以看看这篇文章,说得很好 https://www.cnblogs.com/xuejiaming/p/15237878.html) ,ps:如果不需要重排,IShardingRoute.SortTables()实现里直接返回传入的参数即可。

你只要实现了 IShardingRoute 接口,把 IShardingRoute 注册进框架,然后就可以像常规使用方式做增删查改了。
使用案例请参考 github 上的 sharding

@shuxinqin
Copy link
Owner

shuxinqin commented Aug 6, 2022

ps:分片查询目前只支持单表,同时也不支持原生sql查询。

@shuxinqin shuxinqin pinned this issue Aug 23, 2022
@shuxinqin shuxinqin changed the title 分片分表的使用 分库分表的使用 Nov 2, 2022
@xj728
Copy link

xj728 commented Mar 19, 2023

能写一个简单的按CreateTime 的Year分表的demo吗? 全部揉在一起,真的很难看懂

1 similar comment
@xj728
Copy link

xj728 commented Mar 19, 2023

能写一个简单的按CreateTime 的Year分表的demo吗? 全部揉在一起,真的很难看懂

@shuxinqin
Copy link
Owner

能写一个简单的按CreateTime 的Year分表的demo吗? 全部揉在一起,真的很难看懂

使用Chloe分库分表功能,需要明白的几点是:

  1. Chloe不负责创建数据库或数据表,你需要根据自己的分片情况维护所有表集合 https://github.com/shuxinqin/Chloe/blob/master/src/ChloeDemo/Sharding/OrderShardingRoute.cs#L71
  2. 当查询如 query.Where(a => a.CreateTime == createTime) 时,Chloe框架需要知道定位到哪些分表,所以你要从你维护的所有分表集合中筛选出符合条件的分表来 https://github.com/shuxinqin/Chloe/blob/master/src/ChloeDemo/Sharding/OrderShardingRoute.cs#L183 ,因此你需要为 CreateTime字段创建路由规则

https://github.com/shuxinqin/Chloe/blob/master/src/ChloeDemo/Sharding/OrderShardingRoute.cs 是一个按年分库,月分表的例子,我已经补充了很多详细注释,你可以参考一下,有什么不懂的问就好了,demo我就不帮你写了。

@shuxinqin
Copy link
Owner

shuxinqin commented Mar 20, 2023

可以加qq群讨论,群号 325936847

@xj728
Copy link

xj728 commented Mar 20, 2023

群满员了

@nodyang
Copy link

nodyang commented May 23, 2024

要不要见个微信群呢

@shuxinqin
Copy link
Owner

要不要见个微信群呢
用不着,我经常上github的,有问题就在issues讨论就好了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants