什么时候应该在 Django 中使用 db_index=True?

Arb*_*ain 7 django django-models django-forms django-rest-framework

我们什么时候应该定义db_index=True模型字段?

我正在尝试优化应用程序并想了解更多关于db_index我们应该在哪些条件下使用它?

文档说在模型字段上使用 db_index=True 可以加快查找速度,但在存储和内存方面略有不利。

我们应该db_index=True只在那些具有唯一值的字段上使用,比如主字段id吗?如果我们为那些不唯一且包含重复数据的字段启用索引会发生什么。

Isl*_*aev 11

当您设置db_index=True某个字段时,基于该字段的查询会更快O(log(n))而不是O(n)。在底层,它通常使用B-Tree来实现。

这些加速查询的代价是增加了内存使用量和写入时间。因此,索引的最佳用例是如果您有一个经常被非主字段查询的读取量很大的表。


Gul*_*ati 7

db_index=True使用时应该使用unique=True,有特定的理由使用它,

通过使用这种方法,您可以提高一点性能,

当我们在 SQL 中发起查询时,查找是从上到下开始的

Case: 'Without db_index=True': 即使我们找到数据,它也会搜索和过滤直到所有底部行

情况:'With db_index=True':当对象找到时,它将停止它们

它将提高一点性能


小智 6

我会说db_index=True当你有一个独特的字段来进行更有用的查找时,你应该使用。

例如,如果您有一个customers包含许多记录的表,则users它们每个都有自己独特的user_id. 每一个user_id都是唯一的,并且必须索引这个字段才能找到唯一的用户,而不是说他们的first_namelast_name。实际上这也可以,但是由于它们不是唯一的,因此您可能会从查询中收到多个结果,这可能不如使用引用它们的 id 有用。

查看此处以了解有关索引的更多信息

  • 换句话说,如果要使用 Entity.objects.get(some_field=some_value) ,则使用 db_index=True 。 (4认同)
  • 无论如何,大多数数据库都会自动为外键添加索引 (3认同)