这可能是一个非常愚蠢的问题,但是对数据库表中的布尔字段建立索引是否会有很多好处?
在常见情况下,例如将“软删除”记录标记为非活动状态,因此大多数查询都包括WHERE deleted = 0
,这将有助于对该字段进行单独索引,还是应将其与其他常见搜索字段结合使用不同的索引?
Answers:
没有。
您可以对要搜索的字段具有较高的选择性/基数进行索引。几乎所有表都消除了布尔字段的基数。如果有的话,它将使您的写入速度变慢(降低的幅度如此之小)。
如果每个查询都考虑了软删除,也许您会使其成为聚簇索引中的第一个字段?
WHERE field = false
或某些其他通常是特定于平台的非btree索引为搜索布尔值提供了btree的替代方法。这也取决于您的搜索条件以及表的哪一部分为真与假。
我认为这会有所帮助,尤其是在涵盖指数方面。
当然,多少/一点取决于您的数据和查询。
您可以拥有各种有关索引的理论,但是最终答案是由数据库引擎在具有实际数据的数据库中给出的。通常,您会对答案感到惊讶(或者也许我的理论太糟糕了;)
检查查询的查询计划,并确定是否可以改进查询或是否可以改进索引。更改索引很简单,看看它有什么区别
我认为,如果你的布尔场就是这样,你会提到他们在许多情况下,它将使意义有一个单独的表,例如DeletedPages,或SpecialPages,这将有许多布尔类型的字段,如is_deleted
,is_hidden
,is_really_deleted
,requires_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的基数才能使该字段上的索引工作,但是请确认这一点。