Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql中超大表的分页和筛选(键集分页?)_Sql_Node.js_Postgresql - Fatal编程技术网

postgresql中超大表的分页和筛选(键集分页?)

postgresql中超大表的分页和筛选(键集分页?),sql,node.js,postgresql,Sql,Node.js,Postgresql,我有一个科学数据库,目前有4300000条记录。这是一个科学数据库,一个API提供给它。到2020年6月,我可能会有大约100000000条记录 这是表“输出”的反布局: ID | sensor_ID | speed | velocity | direction ----------------------------------------------------- 1 | 1 | 10 | 1 | up 2 | 2

我有一个科学数据库,目前有4300000条记录。这是一个科学数据库,一个API提供给它。到2020年6月,我可能会有大约100000000条记录

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

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、传感器ID、速度、速度和方向

我想要实现的是一个体面的分页和过滤方法。我想在nodejs中创建一个网站,其中现在将显示+4000000条记录,每页10000条记录。我还希望能够对传感器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

...
我正在搜索一些关于创建一个合适的分页方法的信息/提示。目前,它仍然是安静快速的方式,我这样做,但我认为它会慢得多,当我们达到+5000万记录

首先,我找到了这个页面:。我对键集分页感兴趣。但老实说,我不知道如何开始

我认为我必须做的是:

在ID字段上创建索引:

CREATE UNIQUE INDEX index_id ON output USING btree (ID)
我还发现了这个页面:。当您向下滚动到改进2:Seek方法时,您可以看到他们删除了OFFSET子句,并且正在使用WHERE子句。我还看到他们在查询中使用了最后一个插入ID:

SELECT * FROM output WHERE ID < <last_insert_id_here> ORDER BY ID DESC LIMIT 10000
我不完全理解这一点。对于第一页,我需要最后一个插入ID。然后我获取10000条最新记录。但是在那之后,为了得到第二页,我不需要最后一个插入ID,我需要最后10000个插入ID

有人能给我一个关于快速分页和过滤的好解释吗

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

谢谢大家!祝你2020年愉快

编辑1:我不知道,但是massiveJS是否可以使用?我应该在所有查询中使用它,还是只在分页查询中使用它

编辑2:我想我已经弄明白了,如果我错了,请纠正我

假设我有100000条记录:

1获取最后插入的ID

2使用最后插入的ID获取最后10000条记录

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显示10000条记录,但同时保存10000条记录的插入ID,以便在下一次查询中使用

4使用新的最后一个插入id获取接下来的10000条记录

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最大,您可能需要一个降序索引。使用btree id DESC在输出上创建唯一索引id


Pro tip SELECT*对大型数据库的性能有害。始终列出您实际需要的列。

在键集分页中,您应该按照ORDER BY子句在要设置的内容上设置WHERE子句,对于DESC,您应该使用谢谢。我使用的是一个无限卷轴,但我需要一个hasnextpage变量来知道在获取n个结果之后是否有更多的结果要获取。如果没有,则必须隐藏加载图标。因此,当我有100000条记录,我取出前10000条记录时,我需要知道是否还有任何记录,确实是90000条记录,但在第10页,当我取出最后10000条记录时,没有任何记录。如何实现这一点?我遇到的问题是,当数据库中没有结果时,最后一次查询会继续运行。假设我有100条记录,我一次取10条记录。上次查询的最后一个ID将为1。但是没有ID为0的记录,因此ID 1=最后/第一条记录。问题是我的查询将搜索ID<1的记录,但找不到任何记录,并且查询将继续运行。我只希望查询返回false或类似的结果。你说结果集中没有行的查询永远不会运行完吗?这太离奇了!查看实际查询?在交互式shell中运行?我的解释不正确。它没有完成就没有运行,但是因为我没有错误管理,我从来没有看到错误,而且它似乎还在运行。
SELECT Col1, Col2, Col3 
FROM db.tbl 
WHERE Col3 LIKE '%search_term%'
ORDER BY Col1 DESC , Col2 ASC
LIMIT 10000
SELECT Col1, Col2, Col3 
FROM db.tbl 
WHERE Col3 LIKE '%search_term%'
AND ( Col1 < Col1_last_row_value AND Col2 > Col2_last_row_value)
ORDER BY Col1 DESC , Col2 ASC
LIMIT 10000