在 Informix 中创建索引的正确方法
Right way to create index in Informix
在我的一个 Informix 表中,有两个索引在三个列中只有一个不同的列。以下是索引:
CREATE INDEX informix.ix_1
ON informix.test(date, operator, rn)
CREATE INDEX informix.ix_2
ON informix.test(choice, date, operator)
date is from type Date
operator is Char(3)
choice is Integer
rn is Integer
把这些索引合二为一丢掉是不是很聪明,这样:
CREATE INDEX informix.ix_new
ON informix.test(date, operator, rn, choice)
索引设计基于您需要索引支持的查询。
索引中列的顺序很重要,这也与您需要索引支持的查询有关。
在分析查询之前,您无法确定合并索引是否明智。
我不经常使用 Informix,但我看到 Informix 性能指南中有一章是关于 Queries and the query optimizer 的。您应该阅读该指南以获取有关如何分析查询的更多提示。
在不知道您 运行 反对那个 table 的情况下,不清楚这些索引中的任何一个是否有用。 table 的大小 — 宽度(列数及其类型)和长度(行数)也会影响等式。由于索引不是唯一的,因此它们不存在以强制执行键约束。
如果您始终指定确切的日期,则可以使用 ix_1
索引。如果你还指定一个运算符,它会更有用(更具限制性);如果您还指定 rn
,这将是最有用的。如果您不指定日期,将不会使用 ix_1
。
与ix_2
类似,如果总是指定一个选项,可以使用索引;如果您还指定运算符和日期,它将更有用(限制性更强)。
有了新索引,'choice' 列只有在您始终指定日期、运算符和 rn
时才会真正有用。
记住 (non-unique) 个索引代表一个 trade-off。它们必须得到维护,因此当您添加新行,或更新现有行中的索引列之一,或删除一行时,还必须适当地修改每个索引。如果在更改之间频繁使用索引,那么在 speed-up 的查询中,维护成本会超过其本身的成本。如果您很少查询 table 或者索引从未与您 运行 针对 table 的查询一起使用,那么索引只是存储开销(以及边际优化开销,因为它们必须研究它们是否可以帮助查询——但这是 second-order 效果)。如果索引加快了查询速度,那么它们的维护成本就不是问题。如果它们从未被使用过,那么它们就是白费力气。
唯一索引通常有助于实施数据库约束,并且有不同的考虑因素,尽管有很多相似之处。如果列的某些组合必须是唯一的,即使索引从未在任何查询中使用(尽管可能会使用索引将)。
所有这些几乎适用于任何使用索引的数据库。有整本关于特定数据库设计的索引方案设计的书籍。
在我的一个 Informix 表中,有两个索引在三个列中只有一个不同的列。以下是索引:
CREATE INDEX informix.ix_1
ON informix.test(date, operator, rn)
CREATE INDEX informix.ix_2
ON informix.test(choice, date, operator)
date is from type Date
operator is Char(3)
choice is Integer
rn is Integer
把这些索引合二为一丢掉是不是很聪明,这样:
CREATE INDEX informix.ix_new
ON informix.test(date, operator, rn, choice)
索引设计基于您需要索引支持的查询。
索引中列的顺序很重要,这也与您需要索引支持的查询有关。
在分析查询之前,您无法确定合并索引是否明智。
我不经常使用 Informix,但我看到 Informix 性能指南中有一章是关于 Queries and the query optimizer 的。您应该阅读该指南以获取有关如何分析查询的更多提示。
在不知道您 运行 反对那个 table 的情况下,不清楚这些索引中的任何一个是否有用。 table 的大小 — 宽度(列数及其类型)和长度(行数)也会影响等式。由于索引不是唯一的,因此它们不存在以强制执行键约束。
如果您始终指定确切的日期,则可以使用 ix_1
索引。如果你还指定一个运算符,它会更有用(更具限制性);如果您还指定 rn
,这将是最有用的。如果您不指定日期,将不会使用 ix_1
。
与ix_2
类似,如果总是指定一个选项,可以使用索引;如果您还指定运算符和日期,它将更有用(限制性更强)。
有了新索引,'choice' 列只有在您始终指定日期、运算符和 rn
时才会真正有用。
记住 (non-unique) 个索引代表一个 trade-off。它们必须得到维护,因此当您添加新行,或更新现有行中的索引列之一,或删除一行时,还必须适当地修改每个索引。如果在更改之间频繁使用索引,那么在 speed-up 的查询中,维护成本会超过其本身的成本。如果您很少查询 table 或者索引从未与您 运行 针对 table 的查询一起使用,那么索引只是存储开销(以及边际优化开销,因为它们必须研究它们是否可以帮助查询——但这是 second-order 效果)。如果索引加快了查询速度,那么它们的维护成本就不是问题。如果它们从未被使用过,那么它们就是白费力气。
唯一索引通常有助于实施数据库约束,并且有不同的考虑因素,尽管有很多相似之处。如果列的某些组合必须是唯一的,即使索引从未在任何查询中使用(尽管可能会使用索引将)。
所有这些几乎适用于任何使用索引的数据库。有整本关于特定数据库设计的索引方案设计的书籍。