这可能是一个非常愚蠢的问题,但在索引数据库表中的布尔字段方面会有很多好处吗?
鉴于常见情况,例如标记为非活动状态的“软删除”记录,因此大多数查询都包含WHERE deleted = 0
,是否有助于将该字段自行编入索引,或者是否应将其与不同索引中其他常用的搜索字段?
答案 0 :(得分:55)
没有
您索引搜索到的字段并具有高选择性/基数。布尔字段的基数几乎在任何表格中都被删除。如果有的话,它会使你的写入速度变慢(以非常小的数量)。
如果每个查询都考虑了软删除,也许你会把它作为聚集索引中的第一个字段?
答案 1 :(得分:17)
有关deleted_at DATETIME列的内容是什么?有两个好处。
您的查询可能如下所示:
SELECT * FROM xyz WHERE deleted_at IS NULL
答案 2 :(得分:6)
我认为这会有所帮助,特别是在覆盖指数方面。
多少/当然取决于您的数据和查询。
您可以获得有关索引的各种理论,但最终答案由具有真实数据的数据库中的数据库引擎提供。通常你会对答案感到惊讶(或者我的理论太糟糕了;)
检查查询的查询计划,并确定是否可以改进查询,或者是否可以改进索引。 改变指数很简单,看看它有什么不同
答案 3 :(得分:2)
我认为如果你使用一个视图(删除= 0)会有所帮助,并且你经常从这个视图中查询。
答案 4 :(得分:2)
我认为如果你的布尔字段在很多情况下你会引用它们,那么有一个单独的表,例如DeletedPages或SpecialPages,它将有许多布尔类型字段,如{{1 }},is_deleted
,is_hidden
,is_really_deleted
等等,然后你会接受连接来获取它们。
通常,此表的大小会更小,您可以通过连接获得一些优势,特别是在代码可读性和可维护性方面。对于这种类型的查询:
requires_higher_user
如此实施它会更快:
select all pages where is_deleted = 1
我想我在某处读到有关mysql数据库的内容,你需要一个字段至少具有3的基数才能在该字段上进行索引编制,但请确认一下。
答案 5 :(得分:0)
如果您使用的是支持位图索引的数据库(例如Oracle),那么布尔列上的这样一个索引将比没有它更有用。