在我的一个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)
答案 0 :(得分:2)
索引设计基于您需要索引支持的查询。
索引中列的顺序很重要,这也与您需要索引支持的查询有关。
在分析查询之前,您无法确定合并索引是否智能。
我不定期使用Informix,但我看到Informix性能指南中有一章关于Queries and the query optimizer。您应阅读该指南,以获取有关如何分析查询的更多提示。
答案 1 :(得分:2)
不知道您对该表运行了什么查询,不清楚这些索引是否有用。表格的大小 - 宽度(列数及其类型)和长度(行数)也会影响等式。由于索引不是唯一的,因此它们不存在以强制执行关键约束。
如果您始终指定确切日期,则可以使用ix_1
索引。如果您还指定了一个运算符,它将更有用(更具限制性);如果你还指定rn
,它将是最有用的。如果您未指定日期,则不会使用ix_1
。
同样,对于ix_2
,如果始终指定选项,则可以使用索引;如果你还指定了运算符和日期,它将更有用(更具限制性)。
使用新索引时,如果您始终指定日期,运算符和rn
,“选择”列将真正有用。
请记住(非唯一)索引代表权衡。必须维护它们,因此当您添加新行或更新现有行中的某个索引列或删除行时,还必须适当地修改每个索引。如果在更改之间经常使用索引,那么维护成本可以超过查询加速的成本。如果您很少查询表,或者索引从未与针对表运行的查询一起使用,那么索引只是存储开销(以及边际优化开销,因为必须研究它们以查看它们是否可以帮助查询 - 但这是二阶效应)。如果索引加快查询速度,则维护成本不是问题。如果它们从未被使用过,那么它们就会非常浪费。
唯一索引通常有助于强制执行数据库约束,并且受到不同的考虑,但有许多相似之处。如果列的某些组合必须是唯一的,那么即使索引从未在任何查询中使用过,索引仍然有用(尽管可能会使用索引 )。
所有这些都适用于任何使用索引的数据库。关于特定数据库设计的索引方案设计有完整的书籍。