索引布尔字段

对数据库表中的布尔字段进行索引会有很多好处吗?

在一个常见的情况下,如“软删除”记录被标记为非活动,因此大多数查询包括 WHERE deleted = 0,它是否有助于有索引的字段本身,或者应该与其他常见的搜索字段在不同的索引?

27086 次浏览

没有。

对搜索到的、具有高选择性/基数的字段进行索引。布尔字段的基数在几乎所有表中都消失了。如果有什么不同的话,那就是它会让你的写作速度变慢(哦,这么一点点)。

如果每个查询都考虑到软删除,也许您会将其作为聚集索引中的第一个字段?

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

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

你可以有关于索引的各种各样的理论,但是最终的答案是由数据库引擎在一个有真实数据的数据库中给出的。而且你经常会对这个答案感到惊讶(或者我的理论太糟糕了;)

检查查询的查询计划,确定查询是否可以改进,或者索引是否可以改进。 修改索引并观察其效果非常简单

我认为如果您正在使用一个视图(其中已删除 = 0) ,并且您经常从这个视图进行查询,那么会有所帮助。

我认为,如果你的布尔字段是这样的,你会在很多情况下引用它们,这将是有意义的有一个单独的表,例如 DeletedPages,或 SpecialPages,它将有许多布尔类型的字段,如 is_deletedis_hiddenis_really_deletedrequires_higher_user等,然后你会采取联接获取它们。

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

select all pages where is_deleted = 1

以这种方式实施会更快:

select all pages where pages
inner join DeletedPages on page.id=deleted_pages.page_id

我想我在某个地方读到过,关于 mysql 数据库,你需要一个至少有3基数的字段,才能在这个字段上建立索引,但是请确认一下。

什么是删除 _ at DATETIME 列? 有两个好处。

  1. 如果需要惟一的列(如 name) ,可以多次创建和软删除同一名称的记录(如果对已删除的列使用惟一索引 _ at AND name)
  2. 您可以搜索最近删除的记录。

您的查询可以如下所示:

SELECT * FROM xyz WHERE deleted_at IS NULL

如果您使用的数据库支持位图索引(比如 Oracle) ,那么对布尔列使用这样的索引要比不使用索引有用得多。