索引布尔字段

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

考虑到一个常见的情况,比如“软删除”被标记为不活动的logging,因此大多数查询包括WHERE deleted = 0 ,是否有助于让该字段自己索引,还是应该与其他常用索引组合使用?search字段在不同的索引?

没有。

您可以对search到的字段进行索引,并具有较高的select性/基数。 几乎所有的表格中都会删除一个布尔字段的基数。 如果有的话,它会使你的写入速度变慢(通过这么小的数量)。

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

什么是关于deleted_at DATETIME列? 有两个好处。

  1. 如果需要名称这样的唯一列,则可以多次创build和软删除具有相同名称的logging(如果在列deleted_at和name上使用唯一索引)
  2. 您可以search最近删除的logging。

你的查询可能看起来像这样:

 SELECT * FROM xyz WHERE deleted_at IS NULL 

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

当然,多less/less量依赖于您的数据和查询。

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

检查查询的查询计划,并确定查询是否可以改进,或者索引是否可以改进。 改变指数并且看看它有多大的差别非常简单

我认为如果你的布尔型字段在很多情况下会引用它们,那么有一个单独的表,例如DeletedPages或者SpecialPages,它将会有许多布尔types字段,比如is_deletedis_hiddenis_really_deletedrequires_higher_user等,然后你会join获取它们。

通常情况下,这个表的大小会更小,并且通过连接可以获得一些优势,特别是在代码可读性和可维护性方面。 对于这种types的查询:

select all pages where is_deleted = 1

这样执行会更快:

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

我想我读了一些有关MySQL数据库的地方,你需要一个字段,至less有3的基数,使该领域的索引工作,但请确认这一点。

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

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