1) 在 PostgreSQL 中实现分页的最佳方式是什么?
假设我们需要实现分页。最简单的查询是select * from MY_TABLE order by date_field DESC limit 10 offset 20
. 据我了解,我们这里有两个问题:如果日期可能有重复的值,则此查询的每次运行可能会返回不同的结果,并且偏移值越大,查询运行的时间就越长。我们必须提供附加列,即 date_field_index:
--date_field--date_field_index--
12-01-2012 1
12-01-2012 2
14-01-2012 1
16-01-2012 1
--------------------------------
现在我们可以写类似
create index MY_INDEX on MY_TABLE (date_field, date_field_index);
select * from MY_TABLE where date_field=<last_page_date and not (date_field_index>=last_page_date_index and date_field=last+page_date) order by date_field DESC, date_field_index DESC limit 20;
..因此使用 where 子句和相应的索引而不是偏移量。好的,现在问题:
1)这是改善初始查询的最佳方法吗?2)我们如何填充 date_field_index 字段?我们必须为此提供一些触发器吗?3) 我们不应该在 Postgres 中使用 RowNumber() 函数,因为它们不使用索引,因此非常慢。这是对的吗?
2) 为什么连接索引中的列顺序不会影响查询的性能?
我的测量结果表明,在使用连接索引(由 2 列或更多列组成的索引)进行搜索时,如果我们将最具选择性的列放在首位 - 或者将其放在末尾,则没有区别。为什么?如果我们将最有选择性的列放在首位 - 我们会通过较短范围的找到的行,这应该会对性能产生影响。我对吗?