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

分库分表:Merger 抽象与批量查询实现 #140

Closed
flycash opened this issue Feb 3, 2023 · 2 comments · Fixed by #160
Closed

分库分表:Merger 抽象与批量查询实现 #140

flycash opened this issue Feb 3, 2023 · 2 comments · Fixed by #160

Comments

@flycash
Copy link
Contributor

flycash commented Feb 3, 2023

仅限中文

使用场景

我们将启动新的分库分表特性支持。

为了支持分库分表,一个重要的抽象就是处理结果集,这个抽象被我命名为:

type Merger interface {
    Merge(ctx context.Context, results []*sql.Rows) (sql.Rows, error)
}

它会作为一个非常独立的模块,暂时放进去 internal/merger 包里面。

整个 merge 包必须完全独立,即不依赖与 eorm 的其它任何包,后面我会考虑将它拆出去作为一个独立的项目。这主要是因为后面我不仅考虑结合 ORM 来做分库分表,还想设计一个纯粹的分库分表的 driver,或者一个分库分表的 proxy,sidecar 等。

同时,你还需要提供一个最基本的实现,即批量查询的实现。

例如我们可以预期一个查询 select * from user_tab where id in (1, 2, 3) 那么会被分库分表成三个查询,这个实现就是将这三个查询的结果汇总在一起。

但是需要注意的是,该实现要考虑性能问题,即如果多个查询总共返回数十万行数据,该如何处理。核心就是要避免自己提前调用 Next 将所有的数据都取过来,然后缓存在内存里面,而是应该在用户调用 Next 的时候再调用一个 results 里面特定的 sql.Rows 的 Next 方法。

@Stone-afk
Copy link
Collaborator

sql.Rows 没有对外暴露合并的API吧,只能自己定义一个Rows,然后类似迭代器的设计,当外部调用Next的时候,取result 其中 的一个 sql.Rows 的 Next

@flycash
Copy link
Contributor Author

flycash commented Mar 1, 2023

sql.Rows 没有对外暴露合并的API吧,只能自己定义一个Rows,然后类似迭代器的设计,当外部调用Next的时候,取result 其中 的一个 sql.Rows 的 Next

对的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging a pull request may close this issue.

2 participants