2009-12-04 108 views
63

这可能是一个非常愚蠢的问题,但索引数据库表中的布尔型字段会有多大好处吗?给定一种常见的情况,如“软删除”被标记为非活动状态的记录,因此大多数查询包括WHERE deleted = 0,它是否有助于让该字段自行索引,还是应该与其他常用的索引组合使用搜索不同索引的字段?索引布尔字段

+0

可能重复[索引布尔型字段是否有任何性能增益?](http://stackoverflow.com/questions/10524651/is-there-any-performance-gain-in-indexing-a-boolean-字段) – 2016-04-13 12:14:04

+3

@AmirAliAkbari:哦!没有!循环参考!希望S.O.不会爆炸! – Paul 2017-02-01 14:49:49

回答

51

编号

您可以搜索具有高选择性/基数的字段。几乎任何表格中都会删除一个布尔字段的基数。如果有的话,它会让你的写入变慢(通过一个很小的数量)。

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

+2

想象一个拥有数千页的大书。页面包含单个字母,'A'或'B'和一个随机数字。如果您在A和B页面没有混合但书本从A页面开始,然后是B开始的情况下找到某个您知道它位于“A”页面之一的随机数字条目,您是否有好处?是的,你会..所以我猜你错了.. – tObi 2016-09-25 12:29:43

6

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

多少/少数当然依赖于您的数据和查询。

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

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

+3

+1:我没有看到在索引列中造成的危害 – 2009-12-04 05:29:18

+2

@OMGPonies危害在于额外的写入开销,在拥有大量行的繁忙表上,这实际上可以降低查询性能。只有高基数和查询才能充分利用,这只是一个好处。 – oucil 2013-12-10 20:14:15

1

我认为这将有助于如果你使用的是一个视图(其中删除= 0),你经常从这个视图查询。

2

我认为如果你的布尔型字段在很多情况下会引用它们,那么有一个单独的表,例如DeletedPages或SpecialPages,它会有许多布尔类型字段,比如is_deletedis_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的基数使该领域的索引工作,但请确认这一点。

+1

很难说布尔值是如此薄,我们没有任何数据,但是会产生连接,每个查询的工作流程都会使查询变慢,而不是更快,特别是如果主键的集群不同,每个查询都需要deleted_pa​​ges表。 – 2009-12-04 05:51:17

16

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

  1. 如果你需要一个像名称的唯一列,您可以创建和软删除具有相同名称多次记录(如果您使用deleted_at列和名称的唯一索引)
  2. 您可以搜索为最近删除的记录。

您查询看起来是这样的:

SELECT * FROM xyz WHERE deleted_at IS NULL 
0

如果您使用的是支持位图索引(如Oracle)数据库,然后在布尔列这样的索引将有用得多比没有。