8

假设我们有一个带有布尔字段的模型:

class AModel(models.Model):
    flag = models.BoleanField()

有什么理由在这个字段上添加索引吗?

我认为这没有理由,因为搜索中的利润很小(这只是分成两个),但记录的开销很大。但我的同事认为不同。

这有什么经验法则吗?

4

1 回答 1

3

这取决于。

如果您的数据主要具有一个或其他布尔值(即,几乎所有内容都是 FALSE),但您希望通常只查询与另一个匹配的值(即,只查询 TRUE 值),那么在布尔字段可能会对性能产生很大影响:特别是如果您强制索引首先存储 TRUE 值。

诀窍在于字段(和索引)有选择性的,因为您可以丢弃大部分行,因此可以使用索引通过存储有用的行来加快速度。

或者,您可以在不同的字段(也许您也在查询)上有一个索引,该索引使用一个WHERE <boolean-field>子句来存储真实值(反之亦然,具体取决于您的需要)。我还没有尝试过,但我敢打赌 Postgres 能够正确使用这个索引......

于 2020-03-11T11:54:33.787 回答