什么时候设置db_index = True会不会有什么好处?

时间:2015-06-27 10:20:20

标签: django django-models

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

这是一个示例模型

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

我需要查找titleadded列,并且我应该在这些列上设置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会什么时候/不合适?

2 个答案:

答案 0 :(得分:3)

何时考虑向列添加索引?

通常,在决定向列添加索引之前,需要考虑许多点。

Oracle在其文档中定义了多个关于何时向列添加索引的准则: http://docs.oracle.com/cd/B19306_01/server.102/b14211/data_acc.htm#i2769

  • 考虑索引WHERE子句中经常使用的键。
  • 考虑索引经常用于在SQL语句中连接表的键。
  • 选择具有高选择性的索引键。索引的选择性是表中具有相同索引键值的行的百分比。如果少数行具有相同的值,则索引的选择性是最佳的。如果数据分布偏斜,索引低选择性列可能会有所帮助,这样一个或两个值的出现频率远低于其他值。
  • 不要在具有很少不同值的键或表达式上使用标准B树索引。这些键或表达式通常具有较差的选择性,因此除非频繁选择的键值出现频率低于其他键值,否则不会优化性能。在这种情况下,您可以有效地使用位图索引,除非频繁修改索引,就像在高并发OLTP应用程序中一样。
  • 不要索引经常修改的列。修改索引列的UPDATE语句以及修改索引表的INSERTDELETE语句比没有索引时需要更长的时间。此类SQL语句必须修改索引中的数据以及表中的数据。它们还会生成其他撤消和重做。
  • 不要将仅出现在WHERE子句中的键与函数或运算符一起索引。使用除WHEREMIN之外的函数的MAX子句或具有索引键的运算符不会使使用索引的访问路径(基于函数的索引除外)不可用
  • 在大量并发INSERTUPDATEDELETE语句访问父表和子表的情况下,考虑索引引用完整性约束的外键。这样的索引允许父表上的UPDATEsDELETEs,而没有共享锁定子表。
  • 在选择为密钥编制索引时,请考虑查询的性能提升是否值得INSERTsUPDATEsDELETEs的性能损失以及使用存储所需的空间指数。

请记住,当您添加其他索引时,Read操作会更快,但由于重新计算索引,Write操作会变慢。因此,请根据您的用例要求使用它们。

答案 1 :(得分:2)

使用索引的代价是写入性能较慢 - 假设您不太可能每0.0001发布一篇新博客帖子,您可以随意为您搜索的任何内容添加索引。