模型索引引用

索引类易于创建数据库索引。可以使用 Meta.indexes 选择权。本文档解释了 Index 其中包括 index options .

引用内置索引

索引定义在 django.db.models.indexes 但为了方便起见,它们被进口到 django.db.models . 标准惯例是使用 from django.db import models 并将索引引用为 models.<IndexClass> .

Index 选项

class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None)[源代码]

在数据库中创建索引(B树)。

expressions

Index.expressions

位置论元 *expressions 允许对表达式和数据库函数创建函数索引。

例如::

Index(Lower("title").desc(), "pub_date", name="lower_title_date_idx")

对象的小写的值创建索引。 title 字段按降序排列,并且 pub_date 字段以默认升序排列。

另一个示例::

Index(F("height") * F("weight"), Round("weight"), name="calc_idx")

根据字段相乘的结果创建索引 heightweight 以及 weight 四舍五入为最接近的整数。

Index.name 在使用 *expressions

对Oracle的限制

Oracle要求将索引中引用的函数标记为 DETERMINISTIC 。Django没有验证这一点,但是Oracle会出错。这意味着像这样的函数 Random() 是不被接受的。

PostgreSQL限制

PostgreSQL要求将索引中引用的函数和运算符标记为 IMMUTABLE 。Django没有验证这一点,但是PostgreSQL会出错。这意味着像这样的函数 Concat() 是不被接受的。

MySQL和Mariadb

当MySQL<8.0.13和MariaDB都不支持函数索引时,函数索引将被忽略。

fields

Index.fields

需要索引的字段名称的列表或元组。

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

例如 Index(fields=['headline', '-pub_date']) 将使用以下内容创建SQL (headline, pub_date DESC)

马里亚布

在低于10.8的MariaDB上不支持索引排序。在这种情况下,降序索引被创建为普通索引。

name

Index.name

索引的名称。如果 name 未提供,django将自动生成名称。为了与不同的数据库兼容,索引名称不能超过30个字符,并且不能以数字(0-9)或下划线开头 (_) .

抽象基类中的部分索引

必须始终为索引指定唯一的名称。因此,通常不能在抽象基类上指定部分索引,因为 Meta.indexes 选项由子类继承,属性值完全相同(包括 name )每次。要解决名称冲突,名称的一部分可能包含 '%(app_label)s''%(class)s' ,分别替换为具体模型的小写app标签和类名。例如 Index(fields=['title'], name='%(app_label)s_%(class)s_title_index') .

db_tablespace

Index.db_tablespace

的名字 database tablespace 用于此索引。对于单字段索引,如果 db_tablespace 未提供,索引是在 db_tablespace 田野的

如果 Field.db_tablespace 未指定(或者如果索引使用多个字段),则在中指定的表空间中创建索引。 db_tablespace 模型中的选项 class Meta . 如果这两个表空间都没有设置,那么索引将在与表相同的表空间中创建。

参见

有关PostgreSQL特定索引的列表,请参见 django.contrib.postgres.indexes .

opclasses

Index.opclasses

的名称 PostgreSQL operator classes 用于此索引。如果需要自定义运算符类,则必须为索引中的每个字段提供一个。

例如, GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops']) 在上创建GIN索引 jsonfield 使用 jsonb_path_ops .

opclasses 除了postgresql之外的数据库都被忽略。

Index.name 使用时需要 opclasses .

condition

Index.condition

如果表很大,并且查询主要针对行的一个子集,那么将索引限制到该子集可能很有用。将条件指定为 Q . 例如, condition=Q(pages__gt=400) 索引超过400页的记录。

Index.name 使用时需要 condition .

PostgreSQL限制

PostgreSQL要求条件中引用的函数标记为不可变。Django没有验证,但是PostgreSQL会出错。这意味着诸如 日期函数Concat 不被接受。如果你把日期储存在 DateTimeField 比较 datetime 对象可能需要 tzinfo 提供的参数,因为否则比较可能导致可变函数,因为Django的 lookups .

对sqlite的限制

SQLite imposes restrictions 关于如何构造部分索引。

甲骨文公司

Oracle不支持部分索引。相反,可以通过将函数索引与一起使用来模拟部分索引 Case 表情。

MySQL和Mariadb

这个 condition 参数被MySQL和Mariadb忽略,因为它们都不支持条件索引。

include

Index.include

要作为非键列包含在覆盖索引中的字段名称的列表或元组。这允许仅索引扫描用于只选择包含字段的查询 (include )只按索引字段筛选 (fields

例如::

Index(name="covering_index", fields=["headline"], include=["pub_date"])

将允许筛选 headline ,同时选择 pub_date ,而只从索引获取数据。

使用 include 将生成比使用多列索引更小的索引,但缺点是非键列不能用于排序或筛选。

include 对于除PostgreSQL之外的数据库,将忽略。

Index.name 使用时需要 include .

有关的详细信息,请参阅PostgreSQL文档 covering indexes .

PostgreSQL限制

PostgreSQL支持覆盖B树和 GiST indexes 。PostgreSQL 14+还支持覆盖 SP-GiST indexes