如果我在查询中添加where子句,Postgres偏移量将扫描整个表?

问题描述 投票:0回答:2

假设我有 100 000 条记录,其中 20 条记录与具体用户相关。 我正在寻找确认,在查询中添加 where 子句将使 offset 子句仅扫描这 20 行。 例如

record是一个表,它包含user_id的索引

SELECT r.user_id, r.book_name
FROM record r
WHERE r.user_id = 1
ORDER BY r.book_name
LIMIT 2
OFFSET 2;
  • 此查询中的偏移量应仅扫描此 concreate 用户的 20 行,对吗?
  • 如果记录表可以包含十亿条记录,我可以继续使用offset子句吗?还会“快”吗?
  • 谢谢你。

sql postgresql spring-data querydsl
2个回答
0
投票

任何减少数据的 where 子句谓词都将允许 ORDER BY 更快地工作,因为需要排序的元组更少。

请查看说明以查看计划。

PostgreSQL 进行了优化,可以在许多存在 LIMIT/OFFSET 的情况下执行不同的排序(top-n 堆排序)。你可以在stackexchange中搜索到很多关于优化OFFSET的文章。

这里

是博客文章。 带有“快”字的引号,情人眼里出西施。对于用例来说足够快。可能需要进行其他调整,例如 work_mem 和索引以使查询“足够快”。


0
投票

在查询中,OFFSET 子句仅对 WHERE 子句返回的行进行操作,这意味着它会跳过筛选结果的前 n 行,然后应用 LIMIT 返回指定的行数。执行计划显示,首先进行过滤,然后进行偏移和限制应用。

enter image description here 这里是查询分析的SS,你可以看到它会首先应用条件,然后应用限制。到我们得到表单结果的20条记录。

我希望这个解释有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.