【问题标题】:Does Django automatically create indexes?Django 会自动创建索引吗?
【发布时间】:2021-06-03 18:27:39
【问题描述】:

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

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

【问题讨论】:

    标签: python sql django database postgresql


    【解决方案1】:

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

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

    当您在字段上将unique 设置为True 时:

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

    也在SlugField:

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

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

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

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

    【讨论】:

    • 最佳做法是为我的数据库中的每个外键建立一个索引吗?
    • @ThatcherThornberry 完全取决于您的需要。如果您看到我已链接的有关外键的文档,它还指出 “如果您为一致性而不是连接而创建外键,或者如果您将创建一个替代索引,例如部分或多列索引。"
    • 这个元选项是否会在单个字段或联合索引上创建索引?
    • @DeepanshuMehta 将为indexes 列表中的每个Index 实例创建一个索引。因此,对于给定的示例,它会在字段“field1”和“field2”上创建一个多列索引。您可以阅读链接文档(还进一步链接到 Model index reference)以获取更多信息。
    猜你喜欢
    • 2016-07-17
    • 2010-10-24
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多