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