Referens till modellindex¶
Indexklasser underlättar skapandet av databasindex. De kan läggas till med hjälp av alternativet Meta.indexes
. Detta dokument förklarar API-referenserna för Index
som inkluderar index options.
Hänvisning till inbyggda index
Index definieras i django.db.models.indexes
, men för enkelhetens skull importeras de till django.db.models
. Standardkonventionen är att använda from django.db import models
och hänvisa till indexen som models.<IndexClass>
.
alternativ för Index
¶
- class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None)[source]¶
Skapar ett index (B-Tree) i databasen.
uttryck
¶
- Index.expressions¶
Det positionella argumentet *expressions
gör det möjligt att skapa funktionella index på uttryck och databasfunktioner.
Till exempel:
Index(Lower("title").desc(), "pub_date", name="lower_title_date_idx")
skapar ett index på det gemena värdet i fältet title
i fallande ordning och fältet pub_date
i stigande ordning som standard.
Ett annat exempel:
Index(F("height") * F("weight"), Round("weight"), name="calc_idx")
skapar ett index på resultatet av multiplikationen av fälten höjd
och vikt
och vikt
avrundat till närmaste heltal.
Index.name
krävs när man använder *expressions
.
Begränsningar för Oracle
Oracle kräver att funktioner som refereras till i ett index ska markeras som DETERMINISTIC
. Django validerar inte detta men Oracle kommer att göra ett fel. Detta innebär att funktioner som Random()
inte accepteras.
Begränsningar på PostgreSQL
PostgreSQL kräver att funktioner och operatörer som refereras till i ett index markeras som `` IMMUTABLE``. Django validerar inte detta men PostgreSQL kommer att göra fel. Detta innebär att funktioner som Concat()
inte accepteras.
MySQL och MariaDB
Funktionella index ignoreras med MySQL < 8.0.13 och MariaDB eftersom ingen av dem stöder dem.
fält
¶
- Index.fields¶
En lista eller tupel med namnet på de fält som indexet önskas för.
Som standard skapas index med stigande ordning för varje kolumn. Om du vill definiera ett index med fallande ordning för en kolumn lägger du till ett bindestreck före fältets namn.
Till exempel: skulle Index(fields=['headline', '-pub_date'])
skapa SQL med (headline, pub_date DESC)
.
MariaDB
Indexbeställning stöds inte på MariaDB < 10.8. I så fall skapas ett fallande index som ett normalt index.
namn
¶
- Index.name¶
Namnet på indexet. Om name
inte anges kommer Django automatiskt att generera ett namn. För kompatibilitet med olika databaser får indexnamn inte vara längre än 30 tecken och bör inte börja med en siffra (0-9) eller understreck (_).
Partiella index i abstrakta basklasser
Du måste alltid ange ett unikt namn för ett index. Därför kan du normalt inte ange ett partiellt index på en abstrakt basklass, eftersom alternativet Meta.indexes
ärvs av underklasser, med exakt samma värden för attributen (inklusive name
) varje gång. För att komma runt namnkollisioner kan en del av namnet innehålla '%(app_label)s'
och '%(class)s'
, som ersätts av den gemena appetiketten respektive klassnamnet för den konkreta modellen. Till exempel: Index(fields=['title'], name='%(app_label)s_%(class)s_title_index')
.
db_tablespace
¶
- Index.db_tablespace¶
Namnet på det databas-tabellutrymme som ska användas för detta index. För index med ett enda fält skapas indexet i fältets db_tablespace
om db_tablespace
inte anges.
Om Field.db_tablespace
inte anges (eller om indexet använder flera fält) skapas indexet i det tablespace som anges i db_tablespace
-alternativet i modellens class Meta
. Om inget av dessa tablespaces är angivet skapas indexet i samma tablespace som tabellen.
Se även
För en lista över PostgreSQL-specifika index, se django.contrib.postgres.indexes
.
opklasser
¶
- Index.opclasses¶
Namnen på PostgreSQL-operatörsklasserna som ska användas för detta index. Om du behöver en anpassad operatörsklass måste du tillhandahålla en för varje fält i indexet.
Till exempel: skapar GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops'])
ett ginindex på jsonfield
med hjälp av jsonb_path_ops
.
`` Opclasses`` ignoreras för databaser förutom PostgreSQL.
Index.name
krävs när man använder opclasses
.
villkor
¶
- Index.condition¶
Om tabellen är mycket stor och dina frågor oftast riktar sig till en delmängd av rader kan det vara användbart att begränsa ett index till den delmängden. Ange ett villkor som en Q
. Till exempel:, condition=Q(pages__gt=400)
indexerar poster med mer än 400 sidor.
Index.name
krävs när man använder condition
.
Begränsningar på PostgreSQL
PostgreSQL kräver funktioner som refereras till i villkoret för att markeras som IMMUTABLE. Django validerar inte detta men PostgreSQL kommer att fel. Detta innebär att funktioner som Datumfunktioner och Concat
inte accepteras. Om du lagrar datum i DateTimeField
, kan jämförelse med datetime
-objekt kräva att tzinfo
-argumentet tillhandahålls eftersom jämförelsen annars kan resultera i en mutabel funktion på grund av den casting Django gör för lookups.
Begränsningar för SQLite
SQLite ”inför restriktioner <https://www.sqlite.org/partialindex.html>`_ för hur ett partiellt index kan konstrueras.
Oracle
Oracle har inte stöd för partiella index. Istället kan partiella index emuleras genom att använda funktionella index tillsammans med Case
-uttryck.
MySQL och MariaDB
Argumentet condition
ignoreras med MySQL och MariaDB eftersom ingen av dem stöder villkorliga index.
inkludera
¶
- Index.include¶
En lista eller tupel med namnen på de fält som ska ingå i täckningsindexet som icke-nyckelkolumner. Detta gör att skanningar med enbart index kan användas för frågor som endast väljer inkluderade fält (include
) och endast filtrerar efter indexerade fält (fields
).
Till exempel:
Index(name="covering_index", fields=["headline"], include=["pub_date"])
gör det möjligt att filtrera på headline
och även välja pub_date
, samtidigt som data endast hämtas från indexet.
Om du använder include
får du ett mindre index än om du använder ett index med flera kolumner, men nackdelen är att kolumner som inte är nyckelkolumner inte kan användas för sortering eller filtrering.
include
ignoreras för databaser förutom PostgreSQL.
Index.name
krävs vid användning av include
.
Se PostgreSQL-dokumentationen för mer information om täckande index.
Begränsningar på PostgreSQL
PostgreSQL stöder täckning av B-Tree och GiST index
. PostgreSQL 14+ stöder också täckning av SP-GiST-index
.