索引布尔字段


76

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

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



17
@AmirAliAkbari:哦!没有!循环参考!希望这样不会爆炸!
Paul

Answers:


59

没有。

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

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


5
想象一本有数千页的大书。页面包含一个字母“ A”或“ B”以及一个随机数。如果您发现某个随机数条目(如果A和B页没有混合但书仅以A页开头,然后是B页开头),您是否知道某个随机数条目在“ A”页之一上会有所好处吗?是的,你会的..所以我猜你错了..
tObi

1
您确定这是对的吗?例如,如果99%的时间该值是“否”,而您只查询“是”值,我就很容易看到这样的字段是有价值的。(例如,EG仅是活动记录?)
RonLugge,

1
考虑到现代数据库中的许多其他索引策略,我认为答案太简单了。例如,部分索引WHERE field = false或某些其他通常是特定于平台的非btree索引为搜索布尔值提供了btree的替代方法。这也取决于您的搜索条件以及表的哪一部分为真与假。
DB140141 '19

17

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

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

您的查询可能如下所示:

SELECT * FROM xyz WHERE deleted_at IS NULL

6

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

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

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

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


3
@OMGPonies的危害在于额外的写开销,在具有很多行的繁忙表上,这实际上会降低查询性能。只有在基数较高并且构建查询以利用时才有好处。
oucil 2013年

2

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


2

我认为,如果你的布尔场就是这样,你会提到他们在许多情况下,它将使意义有一个单独的表,例如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的基数才能使该字段上的索引工作,但是请确认这一点。


1
鉴于布尔值如此之细并且我们没有任何数据,这很难说,但是如果发生联接及其工作流程,则每个查询都会使查询变慢,而不是更快,特别是如果主键的聚类方式不同以及Deleted_pa​​ges每个查询都需要该表。
Mark Canlas

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.