2011-02-16 109 views
6

在对具有非常高的I/O等待的服务器进行故障诊断时,我注意到存在来自执行SELECT max(x) FROM t WHERE y = ?的查询的大量I/O。向后索引扫描与索引扫描

我的指数是btree (x, y)

我注意到查询计划确实索引扫描向后得到最大值。那不好吗?我应该担心这个问题,或者增加另一个索引(反转)?或者有没有更好的方法来创建适合这种查询类型的索引?

回答

12

不,这不是坏事,从第一个索引页开始需要相同的时间,因为它需要从最后一个索引页开始。使用DESC创建降序索引时,您可以看到“差异”。

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

+0

在(y,x)上创建索引可将查询成本从10k降低到300并大大缩短查询时间。有x DESC没有任何区别。谢谢你的提示! – ibz 2011-02-17 07:05:06

2

索引排序,最低值在前。要查找最大值,向后索引扫描会先找到最大值:)。

我假设SELECT min(x)会导致正常的索引扫描,是吗?

+0

是的,min(x)进行正常扫描。 – ibz 2011-02-16 14:06:54