-
Notifications
You must be signed in to change notification settings - Fork 64
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
分库分表:NOT 支持 #167
Comments
暂时挂起,我需要一个统一的设计 |
这个问题和 #168 是一样的,我们需要在具体实现里面处理这种操作符。 |
需要先解决 #168 |
简单的实现如下
|
Not 其实可以很复杂,里面可以嵌套多个查询条件,对于这个处理有没有什么好的想法 @flycash |
并没有太好的办法。也是跟具体的分库分表算法有关的。比如说在哈希里面,即便 NOT C 的 C 是一个复合条件,你也比较有一个一致的算法来判断是取反,还是广播。 而对于范围就比较容易,NOT C 中 C 确定的取反就可以了。 你有啥好的想法吗?我之前去看 shardingsphere 之类的都是差不多这种策略。你可以看看 shardingsphere 和 vitess 是如何处理的。类似的分布式关系型数据库 TiDB 也会有类似的场景,但是这部分我没有深入了解过。 |
我倾向于用一个函数将not条件取反,然后在求sharding, 例如将 NOT(user_id >= 200) 变成 user_id < 200, NOT((user_id >= 200) OR (user_id < 600)) 变成 (user_id < 200) OR (user_id >= 600) |
|
|
我草这个思路貌似可以啊。比较操作符都好办,between 貌似也没什么难度,NOT IN 呢?还有虽然我现在不考虑支持,就是子查询的那种 NOT EXIST,>= ALL 之类的这种计算反条件有点恶心。 |
NOT IN 不直接可以用吗,防呆不防傻吧。还有 NOT EXIST 和 >= ALL 我觉得有点太复杂了 |
仅限中文
使用场景
NOT 的支持和 AND,OR 不太一样。对于 AND 和 OR 来说,目前可以预期的规则都是 AND 取交集,OR 取并集。NOT 看上去和 AND 和 OR 类似,但是实际上很不一样。
对于范围查询来说,假如说我们的分库分表规则是按照每100来分,那么 NOT(user_id >= 200) 等价于 (user_id <200)。这在范围查询里面是可以确定命中的表是 user_tab_0 和 user_tab_1 。
但是在哈希里面则不一样,比如说 %3 分库分表,那么 NOT(user_id = 1) 应该是广播。因为我们可以预期 user_id 可以是除了 1 以外的任何值,那么肯定是分散在所有的表里面。
因此 NOT 是一个和分库分表算法相关的东西。
The text was updated successfully, but these errors were encountered: