【问题标题】:Is it a good practice to add indexing on a boolean field in a Django model在 Django 模型中的布尔字段上添加索引是一种好习惯吗
【发布时间】:2013-11-01 17:22:38
【问题描述】:

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

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

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

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

这有什么经验法则吗?

【问题讨论】:

  • 这取决于您计划对数据库执行的查询类型。如果它是一个写入繁重的数据库,那么是的,索引是多余的。
  • 一般来说,布尔字段上的索引并没有太大帮助,因为它只会将数据分成两半。您通常希望在具有许多唯一值的列上建立索引。
  • 没有经验法则,这根本不是坏习惯。我理解正确吗?
  • 没有正确答案,每个人都有自己的经验法则。我说:只为“选择性”的字段定义索引,或者您事先知道会经常被查询。稍后您可以分析数据库性能并在实际使用的字段上添加更多索引。通常在一开始就定义许多索引弊大于利。
  • 如果您希望在单个查询中查询多个布尔索引,这些索引会不会很有帮助,因为它们是复合的?例如3 个布尔索引将数据集除以 ~8

标签: django django-models django-orm


【解决方案1】:

视情况而定。

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

其中的诀窍在于字段(和索引)选择性的,因为您可以丢弃大部分行,因此可以使用索引来加快处理速度,方法是存储那些很有用。

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

【讨论】:

  • “特别是如果你强制索引首先存储 TRUE 值” - 很好,在 Django 中如何做到这一点?
  • 可能必须在 RawSQL 迁移中创建索引。我没有积极参与它,但是 IIRC 目前正在进行一些工作,以改进对 django 中功能/表达式索引的支持。
猜你喜欢
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多