首页 > 解决方案 > Django 会自动创建索引吗?

问题描述

我正在开发一个使用 Postgresql 作为附加数据库的 Django 项目。我注意到一些查询花费了很长时间,甚至发现我在数据库中的许多不同字段上有十几个索引,其中一些我认为是不必要的。

我的计划是删除我不需要的那些,但我很想知道 Django 在创建模型时是否以“智能”方式执行此操作,或者是否有一些默认机制来创建我不知道的索引。

标签: pythonsqldjangodatabasepostgresql

解决方案


Django 确实为某些字段自动创建索引。例如,它在Foreign Keys的文档中说明:

在ForeignKey上自动创建一个数据库索引。您可以通过将db_index设置为False来禁用此功能。

此外,当您设置uniqueTrue字段时:

注意,当 unique 为 True 时,不需要指定 db_index,因为 unique 意味着创建索引。

同样在SlugField

意味着将 Field.db_index 设置为 True。

db_index在字段级别上,您可以通过将参数传递给字段来控制字段是否具有索引。

您还可以indexes在模型中指定选项Meta

class MyModel(model.Model):
    ...
    class Meta:
        indexes = [
            models.Index(fields=['field1', 'field2'], name='some_idx'),
        ]

推荐阅读