我有这样的简单查询:
SELECT *
FROM t1
WHERE f1 > 42
AND f2 = 'foo'
AND f3 = 'bar'
ORDER BY f4 DESC
LIMIT 10 OFFSET 100;
我有字段f4的索引(用于其他查询)。条件“f1 > 42 AND f2 = 'foo' AND f3 = 'bar'”不具有代表性,对应表 t1 中 70% 的记录。表中大约有 2 000 000 条记录,并且每天都在增长。此查询的查询计划说明显示使用整个表的 seq 扫描,然后执行排序和限制。
是否可以说 Postgres 以这种方式执行此查询:
- 通过使用字段 f4 上的索引来遍历反向排序的行。
- 对于每一行,与条件 f1 > 42 AND f2 = 'foo' AND f3 = 'bar' 进行比较,如果对应则取它。
- 如果结果集大小大于限制停止迭代。