Django模型字段索引

Shu*_*wal 21 django indexing django-models

我只知道索引是有用的,它查询速度更快.

以下两个有什么区别?

1. class Meta:
       indexes = [
           models.Index(fields=['last_name', 'first_name',]),
           models.Index(fields=['-date_of_birth',]),
]

2. class Meta:
       indexes = [
            models.Index(fields=['first_name',]),
            models.Index(fields=['last_name',]),
            models.Index(fields=['-date_of_birth',]),
]
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 35

第一个示例为last_name字段创建索引,为字段创建单独的索引first_name.

indexes = [
   models.Index(fields=['last_name', 'first_name',]),
]
Run Code Online (Sandbox Code Playgroud)

如果您根据代码中的名字或姓氏进行查找,将非常有用

MyModel.objects.filter(last_name=last_name, first_name=first_name)
MyModel.objects.filter(last_name=last_name)
Run Code Online (Sandbox Code Playgroud)

第二个示例在last_name和first_name字段上创建单个索引.

MyModel.objects.filter(first_name=first_name)
Run Code Online (Sandbox Code Playgroud)

如果一起搜索姓氏和名字,或者自己搜索姓氏(因为它first_name是索引中的第一个字段),它将非常有用.

indexes = [
    models.Index(fields=['first_name',]),
    models.Index(fields=['last_name',]),
]
Run Code Online (Sandbox Code Playgroud)

但是,它本身搜索first_name没有用(因为last_name它不是索引中的第一个字段).

MyModel.objects.filter(first_name=search)
MyModel.objects.filter(last_name=search)
Run Code Online (Sandbox Code Playgroud)

  • @Daviid 理论上,两个字段的一个索引是最快的,但实际上一两个单独的索引可能足够快。使用“explain”查看数据库如何使用索引,并使用基准测试来查看将字段索引在一起是否值得。 (2认同)

Moh*_*med 6

Django 模型索引在 Django 1.11 中引入

\n\n

什么是 Model.indexes:

\n\n

默认情况下,索引是按每列的升序创建的。要定义列的降序索引,请在字段\xe2\x80\x99s 名称前添加连字符。

\n\n

对于您的查询,\nmodels.Index(fields=['last_name', 'first_name','-date_of_birth',]),将创建 SQL(last_name, first_name, date_of_birth DESC).

\n\n

让我们转向你的问题,

\n\n

你问了两个查询之间的区别,

\n\n

两者都会采取models.Index(fields=['-date_of_birth',]),

\n\n

因为至少有一个会覆盖分配的变量。从你的问题来看,至少dateofbirth它会覆盖上面两行。

\n\n

所以根据文档,更好的方法是, \n因为索引字段应该在单个列表中..所以django将从字段列表中准备SQL索引...

\n\n
models.Index(fields=['last_name', 'first_name', '-date_of_birth']),\n
Run Code Online (Sandbox Code Playgroud)\n

  • 您的建议将创建一个索引 - 如果OP想要仅查询名字或出生日期,则该索引将没有用。 (6认同)