索引布尔字段
这可能是一个非常愚蠢的问题,但索引数据库表中的布尔型字段是否会有很多好处?
考虑到一个常见的情况,比如“软删除”被标记为不活动的logging,因此大多数查询包括WHERE deleted = 0
,是否有助于让该字段自己索引,还是应该与其他常用索引组合使用?search字段在不同的索引?
没有。
您可以对search到的字段进行索引,并具有较高的select性/基数。 几乎所有的表格中都会删除一个布尔字段的基数。 如果有的话,它会使你的写入速度变慢(通过这么小的数量)。
如果每个查询考虑到软删除,也许你会把它作为聚簇索引中的第一个字段?
什么是关于deleted_at DATETIME列? 有两个好处。
- 如果需要名称这样的唯一列,则可以多次创build和软删除具有相同名称的logging(如果在列deleted_at和name上使用唯一索引)
- 您可以search最近删除的logging。
你的查询可能看起来像这样:
SELECT * FROM xyz WHERE deleted_at IS NULL
我认为这会有所帮助,特别是在覆盖指数方面。
当然,多less/less量依赖于您的数据和查询。
你可以有各种关于索引的理论,但最终的答案是由数据库中的数据库引擎提供的真实数据。 你常常对答案感到惊讶(或者我的理论太糟糕了)
检查查询的查询计划,并确定查询是否可以改进,或者索引是否可以改进。 改变指数并且看看它有多大的差别非常简单
我认为如果你的布尔型字段在很多情况下会引用它们,那么有一个单独的表,例如DeletedPages或者SpecialPages,它将会有许多布尔types字段,比如is_deleted
, is_hidden
, is_really_deleted
, requires_higher_user
等,然后你会join获取它们。
通常情况下,这个表的大小会更小,并且通过连接可以获得一些优势,特别是在代码可读性和可维护性方面。 对于这种types的查询:
select all pages where is_deleted = 1
这样执行会更快:
select all pages where pages inner join DeletedPages on page.id=deleted_pages.page_id
我想我读了一些有关MySQL数据库的地方,你需要一个字段,至less有3的基数,使该领域的索引工作,但请确认这一点。
如果您使用视图(其中,删除= 0),并且您经常从这个视图查询,这会有所帮助。
如果您使用支持位图索引的数据库(如Oracle),那么布尔列上的这样的索引比没有索引更有用。