索引类易于创建数据库索引。可以使用 Meta.indexes
选择权。本文档解释了 Index
其中包括 index options .
引用内置索引
索引定义在 django.db.models.indexes
但为了方便起见,它们被进口到 django.db.models
. 标准惯例是使用 from django.db import models
并将索引引用为 models.<IndexClass>
.
Index
选项¶在数据库中创建索引(B树)。
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")
根据字段相乘的结果创建索引 height
和 weight
以及 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=['headline', '-pub_date'])
将使用以下内容创建SQL (headline, pub_date DESC)
。
马里亚布
在低于10.8的MariaDB上不支持索引排序。在这种情况下,降序索引被创建为普通索引。
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
¶的名字 database tablespace 用于此索引。对于单字段索引,如果 db_tablespace
未提供,索引是在 db_tablespace
田野的
如果 Field.db_tablespace
未指定(或者如果索引使用多个字段),则在中指定的表空间中创建索引。 db_tablespace
模型中的选项 class Meta
. 如果这两个表空间都没有设置,那么索引将在与表相同的表空间中创建。
参见
有关PostgreSQL特定索引的列表,请参见 django.contrib.postgres.indexes
.
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
¶如果表很大,并且查询主要针对行的一个子集,那么将索引限制到该子集可能很有用。将条件指定为 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
¶要作为非键列包含在覆盖索引中的字段名称的列表或元组。这允许仅索引扫描用于只选择包含字段的查询 (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
。
12月 18, 2023