关于sql:索引布尔字段

Indexing boolean fields

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

在常见情况下,例如将"软删除"记录标记为非活动记录,因此大多数查询都包含WHERE deleted = 0,这将有助于对该字段进行单独索引,还是应将其与其他常用搜索字段合并 不同索引中的字段?


没有。

您可以对要搜索的字段具有较高的选择性/基数进行索引。几乎所有表都消除了布尔字段的基数。如果有的话,它将使您的写入速度变慢(降低的幅度如此之小)。

如果每个查询都考虑了软删除,也许您会使其成为聚簇索引中的第一个字段?


DATETIME的delete_at列如何处理?有两个好处。

  • 如果您需要像name这样的唯一列,则可以多次创建和软删除具有相同名称的记录(如果在delete_at AND name列上使用唯一索引)
  • 您可以搜索最近删除的记录。
  • 您的查询可能如下所示:

    1
    SELECT * FROM xyz WHERE deleted_at IS NULL


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

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

    您可以拥有各种有关索引的理论,但是最终答案是由数据库引擎在具有实际数据的数据库中给出的。通常您会对答案感到惊讶(或者我的理论太糟糕了;)

    检查查询的查询计划,并确定是否可以改善查询或是否可以改善索引。
    更改索引很简单,看看它有什么区别


    我认为,如果您的布尔字段在许多情况下会引用它们,那么有一个单独的表(例如DeletedPages或SpecialPages)将是有意义的,该表将具有许多布尔类型字段,例如is_deletedis_really_deletedrequires_higher_user等,然后您将进行联接以获取它们。

    通常,此表的大小会更小,并且通过进行联接会获得一些好处,尤其是在涉及代码可读性和可维护性方面。对于这种查询:

    select all pages where is_deleted = 1

    像这样实现它会更快:

    1
    2
    SELECT ALL pages WHERE pages
    INNER JOIN DeletedPages ON page.id=deleted_pages.page_id

    我想我在某处有关mysql数据库的地方读过它,您需要一个字段至少具有3的基数才能使该字段上的索引工作,但是请确认这一点。


    我认为如果您使用的是视图(其中delete = 0)并且定期从该视图中进行查询,将会有所帮助。


    如果您正在使用支持位图索引的数据库(例如Oracle),则布尔列上的此类索引将比没有索引时有用得多。