如果PostgreSQL的count(*)
是always slow,那么如何对复杂查询进行分页?
只要在这种情况下我们有很多页面(例如不同的类别、过滤器等),制作触发器似乎不是一个好的解决方案.
如果VACUUM/VACUUM ANALYZE/ANALYZE/VACUUM FULL
不起作用怎么办?在postgresql中使用count(*)
的最佳实践是什么?
如果PostgreSQL的count(*)
是always slow,那么如何对复杂查询进行分页?
只要在这种情况下我们有很多页面(例如不同的类别、过滤器等),制作触发器似乎不是一个好的解决方案.
如果VACUUM/VACUUM ANALYZE/ANALYZE/VACUUM FULL
不起作用怎么办?在postgresql中使用count(*)
的最佳实践是什么?
你看过那篇文章的标题了吗?
请注意,以下文章仅适用于9.2之前的PostgreSQL版本.现在只执行索引扫描.
使用9.2,你通常会发现你会得到更好的结果.详情请阅读the index-only scans wiki page.
也就是说,在旧版本中,使用LIMIT
和OFFSET
通常可以正常工作.如果不介意一些变化的话,可以使用表统计信息估计行数(因此也可以估计页面数).请参阅"估计行数"in the article you already linked to.
在我看来,使用LIMIT
和OFFSET
分页是一种反模式.很多时候,您可以重新表述分页代码,使其使用sort_column > 'last_seen_value' LIMIT 100
,即避免偏移.这有时会带来非常大的性能提升.