索引布尔字段

时间:2009-12-04 05:13:59

标签: sql mysql database indexing

这可能是一个非常愚蠢的问题,但在索引数据库表中的布尔字段方面会有很多好处吗?

鉴于常见情况,例如标记为非活动状态的“软删除”记录,因此大多数查询都包含WHERE deleted = 0,是否有助于将该字段自行编入索引,或者是否应将其与不同索引中其他常用的搜索字段?

6 个答案:

答案 0 :(得分:55)

没有

您索引搜索到的字段并具有高选择性/基数。布尔字段的基数几乎在任何表格中都被删除。如果有的话,它会使你的写入速度变慢(以非常小的数量)。

如果每个查询都考虑了软删除,也许你会把它作为聚集索引中的第一个字段?

答案 1 :(得分:17)

有关deleted_at DATETIME列的内容是什么?有两个好处。

  1. 如果您需要名称之类的唯一列,则可以多次创建并软删除具有相同名称的记录(如果您对列deleted_at和名称使用唯一索引)
  2. 您可以搜索最近删除的记录。
  3. 您的查询可能如下所示:

    SELECT * FROM xyz WHERE deleted_at IS NULL
    

答案 2 :(得分:6)

我认为这会有所帮助,特别是在覆盖指数方面。

多少/当然取决于您的数据和查询。

您可以获得有关索引的各种理论,但最终答案由具有真实数据的数据库中的数据库引擎提供。通常你会对答案感到惊讶(或者我的理论太糟糕了;)

检查查询的查询计划,并确定是否可以改进查询,或者是否可以改进索引。 改变指数很简单,看看它有什么不同

答案 3 :(得分:2)

我认为如果你使用一个视图(删除= 0)会有所帮助,并且你经常从这个视图中查询。

答案 4 :(得分:2)

我认为如果你的布尔字段在很多情况下你会引用它们,那么有一个单独的表,例如DeletedPages或SpecialPages,它将有许多布尔类型字段,如{{1 }},is_deletedis_hiddenis_really_deleted等等,然后你会接受连接来获取它们。

通常,此表的大小会更小,您可以通过连接获得一些优势,特别是在代码可读性和可维护性方面。对于这种类型的查询:

requires_higher_user

如此实施它会更快:

select all pages where is_deleted = 1

我想我在某处读到有关mysql数据库的内容,你需要一个字段至少具有3的基数才能在该字段上进行索引编制,但请确认一下。

答案 5 :(得分:0)

如果您使用的是支持位图索引的数据库(例如Oracle),那么布尔列上的这样一个索引将比没有它更有用。