在对具有非常高的I/O等待的服务器进行故障诊断时,我注意到存在来自执行SELECT max(x) FROM t WHERE y = ?
的查询的大量I/O。向后索引扫描与索引扫描
我的指数是btree (x, y)
。
我注意到查询计划确实索引扫描向后得到最大值。那不好吗?我应该担心这个问题,或者增加另一个索引(反转)?或者有没有更好的方法来创建适合这种查询类型的索引?
在对具有非常高的I/O等待的服务器进行故障诊断时,我注意到存在来自执行SELECT max(x) FROM t WHERE y = ?
的查询的大量I/O。向后索引扫描与索引扫描
我的指数是btree (x, y)
。
我注意到查询计划确实索引扫描向后得到最大值。那不好吗?我应该担心这个问题,或者增加另一个索引(反转)?或者有没有更好的方法来创建适合这种查询类型的索引?
不,这不是坏事,从第一个索引页开始需要相同的时间,因为它需要从最后一个索引页开始。使用DESC创建降序索引时,您可以看到“差异”。
索引(y,x)对于此查询可能会更好。
索引排序,最低值在前。要查找最大值,向后索引扫描会先找到最大值:)。
我假设SELECT min(x)会导致正常的索引扫描,是吗?
是的,min(x)进行正常扫描。 – ibz 2011-02-16 14:06:54
在(y,x)上创建索引可将查询成本从10k降低到300并大大缩短查询时间。有x DESC没有任何区别。谢谢你的提示! – ibz 2011-02-17 07:05:06