Indexing boolean fields
这可能是一个非常愚蠢的问题,但是对数据库表中的布尔字段建立索引是否会有很多好处?
在常见情况下,例如将"软删除"记录标记为非活动记录,因此大多数查询都包含
没有。
您可以对要搜索的字段具有较高的选择性/基数进行索引。几乎所有表都消除了布尔字段的基数。如果有的话,它将使您的写入速度变慢(降低的幅度如此之小)。
如果每个查询都考虑了软删除,也许您会使其成为聚簇索引中的第一个字段?
DATETIME的delete_at列如何处理?有两个好处。
您的查询可能如下所示:
1 | SELECT * FROM xyz WHERE deleted_at IS NULL |
我认为这会有所帮助,尤其是在涵盖指数方面。
当然,多少/一点取决于您的数据和查询。
您可以拥有各种有关索引的理论,但是最终答案是由数据库引擎在具有实际数据的数据库中给出的。通常您会对答案感到惊讶(或者我的理论太糟糕了;)
检查查询的查询计划,并确定是否可以改善查询或是否可以改善索引。
更改索引很简单,看看它有什么区别
我认为,如果您的布尔字段在许多情况下会引用它们,那么有一个单独的表(例如DeletedPages或SpecialPages)将是有意义的,该表将具有许多布尔类型字段,例如
通常,此表的大小会更小,并且通过进行联接会获得一些好处,尤其是在涉及代码可读性和可维护性方面。对于这种查询:
像这样实现它会更快:
1 2 | SELECT ALL pages WHERE pages INNER JOIN DeletedPages ON page.id=deleted_pages.page_id |
我想我在某处有关mysql数据库的地方读过它,您需要一个字段至少具有3的基数才能使该字段上的索引工作,但是请确认这一点。
我认为如果您使用的是视图(其中delete = 0)并且定期从该视图中进行查询,将会有所帮助。
如果您正在使用支持位图索引的数据库(例如Oracle),则布尔列上的此类索引将比没有索引时有用得多。