如何提供一个API客户端包含1,000,000个数据库的结果吗?(How to provide an

2019-07-03 10:41发布

从我刚才的问题跟进:

使用“游标”在PostgreSQL中分页

什么是提供一个API客户端包含1,000,000个数据库结果的好办法?

目前,我们正在使用PostgreSQL。 一些建议的方法:

  • 使用分页游标
  • 使用随机数寻呼(添加“大于ORDER BY”每个查询)
  • 分页使用LIMIT和OFFSET(分解非常大的数据集)
  • 信息保存到一个文件,让客户端下载
  • 通过迭代的结果,然后将POST数据到客户端服务器
  • 仅返回键到客户端,然后让客户端请求从云文件,如亚马逊S3的对象(可能仍需要分页刚刚拿到文件名)。

什么都没有我想的是愚蠢简单的方式比任何这些选项更好?

Answer 1:

表中有一个主键。 利用它。

取而代之的LIMITOFFSET ,做分页与主键的过滤器。 你在暗示这与您的评论:

使用随机数寻呼(添加“大于ORDER BY”每个查询)

但没有什么随机你应该怎么做。

SELECT * FROM big_table WHERE id > $1 ORDER BY id ASC LIMIT $2

允许客户端指定两个参数,它看到最后一个ID,记录的数量来获取。 你的API将不得不要么有一个占位符,额外的参数,或替代喊出了“取 n标识”它省略了WHERE从查询子句,但是这是微不足道的。

这种方法将使用一个相当有效的索引扫描来获得,以便记录,通常避免排序或需要通过所有跳过的记录进行迭代。 客户可以决定有多少行要一次。

这种方法从不同的LIMITOFFSET的一个关键途径办法:并发修改。 如果INSERT与比一个关键部分客户已经看到更低的键的表,这种做法将不会改变它的结果,而OFFSET的做法将重复的行。 同样,如果您DELETE的行具有低于已经看到ID这种做法的结果不会改变,而OFFSET会跳过一个看不见一行。 有与生成的密钥仅追加桌没有区别,但。

如果你事先知道客户端将要对整个结果集都知道,最有效的事情做的仅仅是把他们整个结果与没有该呼叫业务的设置。 这就是我使用游标。 阅读从数据库中的行,并将其快速发送到客户端,客户端会接受他们。 这个API需要设置客户端是如何缓慢允许为避免过多的后端负载限制; 对一个缓慢的客户端我可能切换到寻呼(如上所述)或卷轴整个游标结果出到临时文件并关闭DB连接。

重要的注意事项

  • 需要UNIQUE约束/ UNIQUE索引或PRIMARY KEY是可靠的
  • 不同并发修改行为来限制/偏移,参见上面


Answer 2:

有API接受的偏移,从开始和的记录数返回。 这是一种分页,客户端可以决定多少条记录在一个页面请求返回。 API还应该返回的可能的记录总数的查询,以便客户知道有多少“页”,或可选当检索到最后一个记录时返回的记录数是零或小于的数量就可以得到记录要求。 您可以通过使用OFFSET子句(开始检索在该记录),并在你的SELECT语句的LIMIT子句(数目的记录返回)在PostgreSQL的查询进行控制。



文章来源: How to provide an API client with 1,000,000 database results?