如果PostgreSQL的count(*)always slow,那么如何对复杂查询进行分页?

只要在这种情况下我们有很多页面(例如不同的类别、过滤器等),制作触发器似乎不是一个好的解决方案.

如果VACUUM/VACUUM ANALYZE/ANALYZE/VACUUM FULL不起作用怎么办?在postgresql中使用count(*)的最佳实践是什么?

推荐答案

你看过那篇文章的标题了吗?

请注意,以下文章仅适用于9.2之前的PostgreSQL版本.现在只执行索引扫描.

使用9.2,你通常会发现你会得到更好的结果.详情请阅读the index-only scans wiki page.

也就是说,在旧版本中,使用LIMITOFFSET通常可以正常工作.如果不介意一些变化的话,可以使用表统计信息估计行数(因此也可以估计页面数).请参阅"估计行数"in the article you already linked to.

在我看来,使用LIMITOFFSET分页是一种反模式.很多时候,您可以重新表述分页代码,使其使用sort_column > 'last_seen_value' LIMIT 100,即避免偏移.这有时会带来非常大的性能提升.

Postgresql相关问答推荐

Postgis超过2个表的查询在运行时爆炸

端口5432失败:致命:数据库xxx&不存在.在PostgreSQL数据库中

使用pg_repack从PostgreSQL中的表中删除OID

Postgres 使用不同元素数据类型的订单数据

是否可以在 postgres jsonb 列中的列表上创建索引

Power BI + Postgres:只读用户

如何使用有限的varchar在postgres中存储单词é

使用 Heroku CLI、Postgres 的 SQL 语法错误

使用间隔参数的 go postgres 准备好的语句不起作用

heroku、postgreSQL、django、comments、tastepie:没有运算符匹配给定的名称和参数类型

PostgreSQL - 我应该如何使用 first_value()?

PostgreSQL 中基于时间戳的移动平均线

使用 ON CONFLICT 从 INSERT 返回行,无需更新

包含受先前 DELETE 影响的行数的变量?

将 Postgres 与 Grails 一起使用

在 PostgreSQL docker 镜像中创建表

try 为 ror 应用程序设置 postgres,出现错误 - fe_sendauth:no password supplied

错误:ERROR: table name specified more than once

按任意时间间隔计算行数的最佳方法

从 5 分钟前的表中获取行