在索引中使用boolean或enum列?

时间:2008-11-20 04:17:29

标签: database indexing

我已经读过为索引选择的列应该在行之间很好地区分,即索引列不应该包含具有相同值的大量行。这表明布尔人或性别等枚举对指数来说是一个糟糕的选择。

但是说我希望按性别查找用户,在我的特定数据库中,只有2%的用户是女性,那么在这种情况下,性别列似乎是获取女性用户时的有用索引,但不是当得到所有男性用户时。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

您有时也可以使用复合索引,其基数列较低(枚举,布尔值),并且基数列较高(可能是出生日期)。这在很大程度上取决于完整的数据以及您真正使用的查询。

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

有关于索引设计的全书。

答案 2 :(得分:1)

这是我让服务器统计信息通知我何时创建索引的情况。除非您知道此查询将占主导地位或者运行此类查询不能事先满足您的性能目标,否则过早创建索引可能只会降低性能而不是增加它。此外,您可能想要考虑如何实际使用查询。在这种情况下,我的猜测是您通常会根据此列进行某种聚合,而不是简单地选择符合条件的用户。在那种情况下,无论如何你都会进行表格扫描,索引不会给你买任何东西。