当前位置: 首页 > 面试题库 >

分页和过滤在PostgreSQL中很大的表上(键集分页?)

马俊
2023-03-14
问题内容

我有一个科学数据库,目前有4,300,000条记录。这是一个科学数据库,并且有API为其提供数据。到2020年6月,我可能会拥有大约1亿条记录。

这是表“输出”的de布局:

ID   | sensor_ID    | speed    | velocity | direction
-----------------------------------------------------
1    | 1            | 10       | 1        | up
2    | 2            | 12       | 2        | up
3    | 2            | 11.5     | 1.5      | down
4    | 1            | 9.5      | 0.8      | down
5    | 3            | 11       | 0.75     | up
...

顺便说一句,这是伪数据。但是输出是一个包含5列的表格:ID,sensor_ID,速度,速度和方向。

我要实现的是一种 不错的
分页和过滤方法。我想创建一个网站(在nodejs中),其中将显示此+4,000,000条记录(目前),每页10,000条记录。我还希望能够过滤sensor_ID,速度,速度或方向。

现在,我有这个查询来选择特定的行:

SELECT * FROM output ORDER BY ID DESC OFFSET 0 LIMIT 10000 // first 10,000 rows

SELECT * FROM output ORDER BY ID DESC OFFSET 10000 LIMIT 10000 // next 10,000 rows

...

我正在搜索有关创建体面分页方法的一些信息/提示。 目前
,它的运行方式仍然非常安静,但是我认为当我们达到+50,000,000条记录时,它的运行速度会慢很多。

首先,我找到了此页面:https : //www.citusdata.com/blog/2016/03/30/five-ways-to-
paginate/。我对 按键 分页感兴趣。但老实说,我不知道如何开始。

认为 我必须做的是:

在ID字段上创建索引:

CREATE UNIQUE INDEX index_id ON output USING btree (ID)

我也找到了此页面:https :
//leopard.in.ua/2014/10/11/postgresql-
paginattion。当您向下滚动到“改进#2:搜索方法”时,您可以看到他们放弃了OFFSET子句,并且正在使用WHERE子句。我还看到他们在查询中使用了
最后一个插入ID

SELECT * FROM output WHERE ID < <last_insert_id_here> ORDER BY ID DESC LIMIT 10000

我对此并不完全了解。对于第一页,我需要最后一个插入ID。然后,我获取了10,000条最新记录。但是在那之后,要获得第二页,我不需要最后一个插入ID,我需要第10,000个最后一个插入ID(我想)。

有人可以快速给我关于分页和过滤的很好的解释。

我正在使用的东西:-postgresql-pgadmin(用于数据库管理)-node.js(最新版本)

谢谢大家!祝您2020年愉快!

编辑1:
我不知道,但是MassiveJS(https://massivejs.org/)可以很好地使用吗?我应该在所有查询上使用它,还是只在分页查询上使用它?

编辑2: 我认为我明白了一点(如果我错了,请纠正我)。

假设我有100,000条记录:

1)获取最后插入的ID

2)使用此最后插入的ID提取最后10,000条记录

SELECT * FROM output WHERE ID < 100000 ORDER BY ID DESC LIMIT 10000 // last insert ID is here 100,000 because I have 100,000 records

3)显示10,000条记录,但还保存10,000条记录的插入ID,以在下一个查询中使用

4)获取具有新的最后插入ID的下一个10,000条记录

SELECT * FROM output WHERE ID < 90000 ORDER BY ID DESC LIMIT 10000 // 90,000 is the very last insert id - 10,000

5)…

这样对吗?


问题答案:

这是我的处理方式。对于我获取的第一页,我使用

SELECT id, col, col, col 
  FROM output 
 ORDER BY id DESC
 LIMIT 10000

然后,在我的客户端程序(node.js)中,id从结果集的最后一行捕获值。当我需要下一页时,请执行此操作。

 SELECT id, col, col, col
   FROM output
  WHERE id < my_captured_id_value
  ORDER BY id DESC

这利用了索引。即使您从表中删除了一些行,它也能正常工作。

顺便说一句,如果您的第一个分页页面具有最大的ID,则您可能希望使用降序索引。 CREATE UNIQUE INDEX index_id ON output USING btree (ID DESC)

专业提示 SELECT *对大型数据库的性能有害。始终列出您实际需要的列。



 类似资料:
  • 问题内容: 我有一个由django-tables2生成的工作表: 上面的代码返回一个包含数百个对象的表,这些对象整齐地分页,每页10个项目。当我单击表格底部的“下一步”时,分页效果很好,并且可以浏览不同的页面。但是,我注意到以下行为: 单击以显示原始未过滤表的子集 单击过滤表底部的“下一步”将显示未过滤表的第二页 再次单击将显示过滤后的表格的第二页 我希望过滤器在浏览不同页面时能够保持不变。我在这

  • 我有一个dynamoDb表,该表有两列, 我的主分区键是-pageId(String), 我还有一个GSI-pageContainer(String)。 我正在使用DynamoDBMapper查询/扫描我的表, 我正在尝试在DynamoDb中实现分页, 我了解DynamoDb中的分页工作在ExclusiveStarKey和LastEvaluatedKey上。 ExclusiveStartKey在第

  • 我正在Drupal7中创建一个自定义模块,使用views_datasource模块提取Json格式的数据,并在前端对数据进行角过滤(来自view的结果不到50个)。我遇到的问题是当我尝试对结果进行分页时。该应用程序显示所有结果,底部有分页编号。当我输入筛选器文本输入时,结果被正确筛选,分页反应正常(收缩和扩展)。我试图做的是使我的显示结果和分页一起工作,这样每个页面的最大结果数是2。我对此非常陌生

  • 问题内容: 我正在使用该软件包在列表视图中提供搜索功能。 现在,我还要向该视图添加分页。 我正在尝试将分页与过滤后的查询集结合起来,但是我不知道如何继续。 到目前为止,我已经尝试了以下方法: 问题答案: 要使用Django过滤器并对过滤后的结果进行分页,你可以执行以下操作: 为你的模型创建一个过滤器类: 开 每个对象都有一个包含过滤查询集的属性,如果需要,你甚至可以覆盖它。 我们将对我们的财产进行

  • 行列+单元格 001_1454578003995 column=hd:abc,时间戳=1454578173766,值=2 001_1454578003996 column=hd:def,timestamp=1454578173766,value=2 002_1454578003997 Column=HD:IJK,时间戳=1454578173766,值=2 你能帮我做这个吗?