2008-11-20 27 views
11

我读过为索引选择的列应该很好地区分行,即索引列不应包含大量具有相同值的行。这表明布尔值或性别等枚举对索引来说是不好的选择。在索引中使用布尔值或枚举列?

但是,如果我想按性别找到用户,并且在我的特定数据库中只有2%的用户是女性,那么在获得女性用户时,性别列似乎是一个有用的索引,但不是在得到所有男性用户时。

那么将索引放在这样的列上通常是个好主意?

回答

1

这是我愿意让服务器的统计信息通知我的时候创建索引的情况下。除非你知道这个查询将占主导地位,否则运行这样的查询不会先验地达到你的性能目标,那么过早地创建索引可能会让你付出性能而不是增加它。另外,您可能想要考虑如何实际使用查询。在这种情况下,我猜测你通常会根据这一列进行某种聚合,而不是简单地选择符合条件的用户。在这种情况下,无论如何你都会进行表扫描,索引不会为你购买任何东西。

3

索引低基数列以提高搜索性能在我的世界中很常见。 Oracle支持为这些情况设计的“位图索引”。请参阅this article以获得简要概述。

我的大部分经验是与Oracle,但我认为其他RDBMS”类似的支持的东西。

2

不要忘了,不过,你可能只能选择女性的时间约为2%。剩下的时间,你会寻找男性。对此,直接表扫描(而不是索引扫描和访问表中的数据)将更快。

还可以,有时,使用复合索引,与加上较高基数柱低基数柱(枚举,布尔值)(出生日期,或许)。这很大程度上取决于完整的数据以及您真正使用的查询。

我的经验是,对男性/女性的指数很少会是真正有用的。一般建议是有效的。还有一点需要记住 - 在添加或删除(或更新)行时,必须保留索引。索引越多,每个修改操作所做的工作就越多,从而减慢系统的速度。

有关于索引设计的全书。

+0

你的答案是好的,但考虑,而不是性别,我们存储的主要城市或国家,这是只有100号,分布式amongs 100万个用户,所以大概1万用户将具有相同的价值,如果我们正在寻找只有一个特定的城市,那么我不想让DB重复100万行,而正常的b +索引对于这个目的会非常糟糕,那么在这种情况下你的建议是什么? – 2011-07-23 09:29:30