低基数标志应该编入索引吗?

时间:2012-05-09 17:50:21

标签: sql performance

假设您有一个表,其中特定的行子集对于读取来说更热。就像is_alive表中有一个名为people的标志一样。或者,如果您实施软/逻辑删除,则搜索条件始终包含is_deleted = 0

这些字段是否应包含在这些表的索引中?如果是这样,他们应该更左或更多吗?

假设你有像......这样的索引。

people [ last_name ]
people [ zip_code ]
people [ gender ]

widgets [ category_id ]
widgets [ seller_id ]

你让他们看起来像

people  [ last_name, is_alive   ]
widgets [ category_id, is_valid ]

或者

people  [ is_alive, last_name   ]
widgets [ is_valid, category_id ]
除非与其他搜索标准配对,否则布隆本身的基数/重要性较低。

虽然几乎每次都使用这个字段,但只是觉得可疑。也许这本身就是一个“问题”?行应该穿梭到具有相同模式的不同表吗?基本上在旗帜上划分。

供应商不可知。

2 个答案:

答案 0 :(得分:0)

某些RBDMS甚至不允许您在位字段上放置索引,例如SQL Server 2000 ......

应该与供应商无关的东西......通常是索引的选择性决定了它的用途。

如果你有一个is_alive的索引,并且拆分为50%活着/ 50%死亡,那么该索引的选择性不足以使其有用。

然而,如果分裂更像99%活着,1%死...那么索引可以在搜索死人时使用,但在寻找活着的人时会被忽略。

因此,如果有一小部分行具有该字段的特定值,那么索引可能非常有用,您经常搜索具有该特定值的行证明索引维护的开销是合理的。

但请记住,这完全取决于您使用的任何RDBMS,您应该针对该特定RDBMS测试任何与性能相关的设计注意事项。

答案 1 :(得分:0)

索引帮助查询的关键方法之一是减少全表扫描需要读取的页数。请记住,数据库引擎正在管理页面,而页面又存储记录。想象一下,我们有一个客户表,它有一个状态索引。过滤到单个状态的查询只需要读取一小部分数据。当然,这个比例可能是10%(对于加利福尼亚州)而不是1%对于一个小州。问题是:读取这些数据需要多少页面。

要回答这个问题,我们需要信息:(1)查询的选择性如何? (2)页面上有多少条记录?因此,如果100个记录适合页面,那么选择2%行的查询几乎总是必须读取所有页面。在这种情况下,索引无法帮助进行全表扫描。该索引反过来会产生开销,因此可能不应该使用它。

另一方面,如果只有1条记录适合页面,那么选择2%行的查询只需读取2%的页面 - 节省50倍。几乎所有索引产生的开销都是值得的。

因为索引被用于多种目的,并且因为不同的数据库引擎以不同的方式实现它们,并且因为页面表的实现方式不同,等等,所以没有硬性规定。但是,我通常可以说低基数标志可能不适合索引。

在我考虑它时,我可以想到一个索引可能证明有效的案例。那将是宽行和可以由索引专门处理的查询(选择标志,从表组按标志计数(*))。

另一方面,如果你有几个这样的标志,复合索引可能有助于查询性能。