索引扫描向后与索引扫描

ibz*_*ibz 9 postgresql query-optimization

在对具有非常高的I/O等待的服务器进行故障排除时,我注意到有很多I/O来自查询SELECT max(x) FROM t WHERE y = ?.

我的索引是btree (x, y).

我注意到查询计划执行Index Scan Backward以获得最大值.那不好吗?我应该担心这个并且可能添加另一个索引(反向)吗?或者有更好的方法来创建适合此类查询的索引吗?

Fra*_*ens 18

不,它没有坏,从第一个索引页开始需要相同的时间,因为它从最后一个索引页开始.使用DESC创建降序索引时可以看到"差异" .

对于此查询,索引(y,x)可能更好.

  • @nisanth074 我相信这完全取决于 WHERE 端的索引选择性。在大多数情况下,您首先要过滤掉例如 300 行,其中 `y = ?` 然后选择 `max(x)`。如果你在 `(x,y)` 上有索引,你就不能对 `y` 值进行过滤。您可以只过滤 `x` 或 `x` 和 `y`,而不是单独过滤 `y`。研究复合索引顺序偏好。我认为它比我更能解释它。 (2认同)