3

我有一个名为 的表hitlist,它有 3 列:

int id
long hitlisted_date
long deleted_date

我将根据这些列查询此表:

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

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

  1. hitlisted_date&上的单独索引deleted_date
  2. 组索引hitlisted_date&deleted_date

更新

该表将只有 1000 - 5000 行。
这些是将要使用的查询模式。

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

对于上述模式,这些索引就足够了吗?

  1. 创建索引 i1_hitlist ON hitlist(hitlisted_date);
  2. 创建索引 i2_hitlist ON hitlist(deleted_date, hitlisted_date);
4

2 回答 2

4

由于hitlisted_dateand 组合将被频繁使用,因此您希望在hitlisted_date第一列的两列上建立一个复合索引:

CREATE INDEX i1_hitlist ON hitlist(hitlisted_date, deleted_date);

该索引可以(并且将)用于单独具有合适条件的查询hitlisted_date,或者用于两个日期。

您可能会发现在 just 上有第二个索引是有益的deleted_date

CREATE INDEX i2_hitlist ON hitlist(deleted_date);

这可用于搜索 just deleted_date。如果您有时在单个删除日期和一系列命中列表日期上进行搜索,那么您可能会发现使用与以下相反的复合索引更好i1_hitlist

CREATE INDEX i2_hitlist ON hitlist(deleted_date, hitlisted_date);

这不太可能有帮助,但唯一确定的方法是尝试并查看。这取决于您的查询模式以及您的查询使用的实际条件。

just 的索引没有真正的优点hitlisted_date;它只是妨碍了优化器(因为它必须查看两个索引并决定哪个更好,并且因为在插入、更新和删除行时还有更多工作要做)。命中列表日期不太可能是唯一索引。如果可以,那么保留单列索引和重复索引将有一个单独的原因。(如果 (A, B, C) 上存在索引,另请参见(A,B) 上的索引是否冗余。)

更改索引后,确保统计信息是最新的(这些天或多或少是自动的,但它曾经很重要),然后使用 SET EXPLAIN 运行查询以检查索引是否正在使用(以及哪些索引是正在使用)。

于 2012-12-14T03:24:55.073 回答
1
CREATE CLUSTER INDEX clusidx ON hitlist(hitlisted_date,deleted_date);
CREATE         INDEX ddatidx ON hitlist(deleted_date);

如果表的行数很少,甚至可能不值得对列进行索引,但是有很多行是可以的。由于您在此表中只有 3 列,因此索引不会成为大量行的问题。

例子:

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

行长度 = 557,nrows = 12,398,250。

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

于 2012-12-14T02:54:49.847 回答