使用时间戳字段上的数据库索引执行以下简单数据库查找"已创建"比在Elasticsearch索引上执行相同的查找(持有相同的数据)要长10倍:
SELECT * FROM "my_table" ORDER BY "created" DESC LIMIT 1000 OFFSET 200000
此查询中没有过滤器,没有文本搜索 - 它是一个带高偏移的简单查找。使用较低的偏移量可以为PostgreSQL和Elasticsearch提供同样快速的结果。偏移越大,时差越大。即使没有对结果进行排序,使用较大的偏移也需要比ES更长的时间。
这是正常的还是PostgreSQL中有一个选项设置不正确?一般来说,数据库表现非常好,并且它在高流量网站上使用。
答案 0 :(得分:2)
偏移量越大,服务器需要计算的行数就越多,因此使用的偏移越高,查询的效率就越低。
limit/offset
的{{3}}警告:
OFFSET子句跳过的行仍然必须在里面计算 服务器;因此,大量的OFFSET可能效率低下。
小型OFFSET
与大型SELECT
的查询计划是什么样的?
根据具体用途 - 例如,您是否在服务器上进行后端工作 - 您可以使用光标而不是执行一系列{{1}虽然对于面向用户的事物和其他无状态连接方案 - 即分页 - 可能不是一种选择。
LIMIT
和OFFSET