关于PostgreSQL性能的两个问题

时间:2013-04-02 14:18:44

标签: sql performance postgresql pagination

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子句和相应的索引而不是offset。好的,现在问题:

1)这是改善初始查询的最佳方法吗? 2)我们如何填充date_field_index字段?我们必须为此提供一些触发器吗? 3)我们不应该在Postgres中使用RowNumber()函数,因为它们不使用索引,因此非常慢。这是对的吗?

2)为什么连锁索引中的列顺序不会影响查询的性能?

我的测量表明,在使用连锁索引(包含2列或更多列的索引)进行搜索时,如果我们将最具选择性的列放在第一位 - 或者如果我们将它放在最后,则没有区别。为什么?如果我们将最具选择性的列放在第一位 - 我们会查找较短的找到的行,这些行应该会对性能产生影响。我是对的吗?

1 个答案:

答案 0 :(得分:1)

使用主键取消而不是date_field_index列。否则解释为什么这不是一个选项。

order by date_field DESC, "primary_key_column(s)" DESC

首先使用最独特列的组合索引是表现最佳的,但如果符合以下条件则不会使用:

  • 不同的值超过表格的百分之几
  • 没有足够的行来使其值得
  • 日期范围不够小

explain my_query的输出是什么?