Django 什么时候会/不会';设置db_index=True不合适吗?

Django 什么时候会/不会';设置db_index=True不合适吗?,django,django-models,Django,Django Models,我知道,当我想加快对列的搜索时,我会在列上添加索引 下面是一个示例模型 class Blog(models.Model): title = models.CharField(max_length=100) added = models.DateTimeField(auto_now_add=True) body = models.TextField() 我需要查找title和added列,我应该在这些列上设置db_index=True class Blog(models.

我知道,当我想加快对列的搜索时,我会在列上添加索引

下面是一个示例模型

class Blog(models.Model):
    title = models.CharField(max_length=100)
    added = models.DateTimeField(auto_now_add=True)
    body = models.TextField()
我需要查找
title
added
列,我应该在这些列上设置
db_index=True

class Blog(models.Model):
    title = models.CharField(db_index=True, max_length=100)
    added = models.DateTimeField(db_index=True, auto_now_add=True)
    body = models.TextField()

但我在网上搜索了更多的例子,我仍然无法理解或总结如何使用它。什么时候设置db_index=True比较合适?

使用索引的惩罚是写性能变慢——如果你不太可能每隔0.0001秒发布一篇新的博客文章,你应该可以为你正在搜索的任何内容随意添加索引。

使用索引的惩罚是写性能变慢——如果你正在使用索引不可能每隔0.000秒发布一个新的博客文章,你就可以自由地为你正在搜索的任何东西添加索引。

< P> <强>何时考虑向列添加索引?< /强> < /P> 一般来说,在决定向列添加索引之前,需要考虑许多点。 Oracle在其文档中定义了关于何时向列添加索引的多条准则:

  • 考虑在
    WHERE
    子句中经常使用的索引键
  • 考虑在SQL语句中经常用于联接表的索引键
  • 选择具有高选择性的索引键。索引的选择性是表中具有相同索引键值的行的百分比。如果有几行具有相同的值,则索引的选择性是最佳的。如果数据分布发生倾斜,使一个或两个值的出现频率远远低于其他值,则索引低选择性列可能会有所帮助
  • 不要对几乎没有不同值的键或表达式使用标准B树索引。此类键或表达式通常具有较差的选择性,因此不会优化性能,除非频繁选择的键值出现的频率低于其他键值。在这种情况下,可以有效地使用位图索引,除非像在高并发OLTP应用程序中那样频繁修改索引
  • 不要索引经常修改的列
    UPDATE
    语句(用于修改索引列)以及
    INSERT
    DELETE
    语句(用于修改索引表)所花费的时间要比没有索引时长。此类SQL语句必须修改索引中的数据以及表中的数据。它们还生成额外的撤消和重做
  • 不要索引仅出现在带有函数或运算符的
    WHERE
    子句中的键。使用函数的
    WHERE
    子句,而不是
    MIN
    MAX
    ,或具有索引键的运算符,不会使使用索引的访问路径可用,基于函数的索引除外
  • 在大量并发
    INSERT
    UPDATE
    DELETE
    语句访问父表和子表的情况下,请考虑索引引用完整性约束的外键。这样的索引允许父表上的
    更新
    删除
    ,而无需共享锁定子表
  • 当选择索引键时,考虑查询的性能增益是否值得<代码> >插入> <代码>、<代码>更新< /代码>和<代码>删除< /C> >和使用存储索引所需的空间。<李>

请记住,当您添加其他索引时,读取操作会更快,但由于重新计算索引,写入操作会变得更慢。所以根据您的用例需求使用它们。

<强>何时考虑向列添加索引?< /强>

一般来说,在决定向列添加索引之前,需要考虑许多点。 Oracle在其文档中定义了关于何时向列添加索引的多条准则:

  • 考虑在
    WHERE
    子句中经常使用的索引键
  • 考虑在SQL语句中经常用于联接表的索引键
  • 选择具有高选择性的索引键。索引的选择性是表中具有相同索引键值的行的百分比。如果有几行具有相同的值,则索引的选择性是最佳的。如果数据分布发生倾斜,使一个或两个值的出现频率远远低于其他值,则索引低选择性列可能会有所帮助
  • 不要对几乎没有不同值的键或表达式使用标准B树索引。此类键或表达式通常具有较差的选择性,因此不会优化性能,除非频繁选择的键值出现的频率低于其他键值。在这种情况下,可以有效地使用位图索引,除非像在高并发OLTP应用程序中那样频繁修改索引
  • 不要索引经常修改的列
    UPDATE
    语句(用于修改索引列)以及
    INSERT
    DELETE
    语句(用于修改索引表)所花费的时间要比没有索引时长。此类SQL语句必须修改索引中的数据以及表中的数据。它们还生成额外的撤消和重做
  • 不要索引仅出现在带有函数或运算符的
    WHERE
    子句中的键。使用函数的
    WHERE
    子句,而不是
    MIN
    MAX
    ,或具有索引键的运算符,不会使使用索引的访问路径可用,基于函数的索引除外
  • 在大量并发
    INSERT
    UPDATE
    DELETE
    语句访问父表和子表的情况下,请考虑索引引用完整性约束的外键。这样的索引允许父表上的
    更新
    删除
    ,而无需共享锁定子表
  • 当选择