2012-12-13 20 views
3

我有一个表叫hitlist,其中有3列:组索引Informix中

int id 
long hitlisted_date 
long deleted_date 

我会根据这些列来查询该表:

histlisted_date (frequent) 
hitlisted_date && deleted_date (frequent) 
deleted_date (not frequent) 

在这种情况下,什么样的我应该使用索引吗?在hitlisted_date & deleted_date

  • 组指数hitlisted_date & deleted_date
  • UPDATE

    1. 单列索引表将只有1000 - 5000行。
      这些是将要使用的查询模式。

      1)hitlisted_date BETWEEN
      2)hitlisted_date <
      3)deleted_date = -1和hitlisted_date < =
      4)deleted_date> 0

      对于上述图案,这些索引就足够了?

      1. CREATE INDEX i1_hitlist ON hitlist(hitlisted_date);
      2. CREATE INDEX i2_hitlist ON hitlist(deleted_date,hitlisted_date);
    +0

    请注意DATE(-1)是1899-12-30。如果一切都足够近以至于它不会干涉,那么你很好,但是不久前有人比一般流通中的人老。 –

    +0

    日期列是'长'数据类型(纪元时间) – cppcoder

    +0

    因此它们不是DATE类型。它们是INTEGER列。 Informix中的DATE类型具有特定的含义。 (并且1969-12-31 23:59:59比1899-12-30更近,即使如此也可能不是问题,但要小心) –

    回答

    4

    由于hitlisted_date和组合将被频繁使用的,要在两列组合索引与hitlisted_date第一:

    CREATE INDEX i1_hitlist ON hitlist(hitlisted_date, deleted_date); 
    

    此索引可以(并且将)是用于查询与合适的条件在hitlisted_date自己,或两个日期。

    您可能会发现它有利于对刚刚deleted_date第二个指标:

    CREATE INDEX i2_hitlist ON hitlist(deleted_date); 
    

    这可以被用于搜索上只是deleted_date。如果你有时做一个删除的日期和范围hitlisted日期搜索,那么你可能会发现它更好地使用这就是i1_hitlist反向复合指数:

    CREATE INDEX i2_hitlist ON hitlist(deleted_date, hitlisted_date); 
    

    这是不太可能是一个帮助,但唯一可以肯定的就是尝试一下,看看。这取决于您的查询模式以及查询使用的实际情况。

    hitlisted_date的指数上没有真正的美德;它只是阻碍了优化器(因为它必须查看两个索引并决定哪个更好,并且因为在插入,更新和删除行时还有更多工作要做)。命中日期不可能是唯一索引。如果可以的话,那么保持单列索引以及重复索引就会有单独的原因。 (另请参阅Is an index on (A,B) redundant if there is an index on (A, B, C)。)

    更改索引后,请确保统计信息是最新的(现在或多或少都会自动更新,但过去很重要),然后使用SET EXPLAIN运行查询以检查正在使用索引(以及正在使用哪些索引)。

    +0

    那么为什么不只是在(A,B,C)上创建一个复合索引呢?这应该涵盖查询的任何组合? –

    +0

    在交叉引用的问题中,(A,B,C)上已经有一个索引;问题是只有(A,B)的索引也会有好处。答案是'不,除非(A,B)是独特的'。 –

    +0

    几个因素:列基数,频繁查询模式,nrows,rowlength,静态或频繁表更新等决定如何索引和列索引? –

    1
    CREATE CLUSTER INDEX clusidx ON hitlist(hitlisted_date,deleted_date); 
    CREATE   INDEX ddatidx ON hitlist(deleted_date); 
    

    如果表中有几行,甚至都不值得索引列,但与许多行肯定。由于此表中只有3列,因此索引不会成为大量行的问题。

    实施例:

    我有13个VARCHAR列和2列DATE一个静态只读表。

    rowlength = 557,nrows = 1239825。

    在7个单独的列上进行索引,因为没有涉及多个列的频繁查询,但是如果频繁查询某个特定的组合列,则为这些查询创建组合列索引。

    +0

    'hdaidx'不会付出代价。 –

    +0

    因为它已经包含在集群索引中了吗? –

    +1

    是;群集索引可用于hdaidx可用于的任何事物。如果对于任何给定的袭击日期将会有大量的删除日期,那么有时可能会更好地使用单列索引,但是对于它是有益的,这是相当不寻常的。如果表是动态的(大量活动),那么额外的索引在更新上可能花费比在select上保存更多;如果表格几乎是静态的(非常小的活动),则相反可能是正确的。命中日期不可能是唯一的索引;如果可以的话,可能还有其他原因。 –