Hoppa till innehåll

Indexerat Fält i Odoo: En Praktisk Guide för Utvecklare och Konsulter

Hur indexattributet fungerar i Odoo ORM, när man ska använda det och vad det betyder för din databasprestanda
6 mars 2026 av
Indexerat Fält i Odoo: En Praktisk Guide för Utvecklare och Konsulter
Dasolo
| Inga kommentarer ännu

Introduktion


Om du har spenderat tid på att skriva eller granska Odoo-fältd definitioner, har du förmodligen stött på något som index=True på ett fält. Det ser litet ut, nästan som en eftertanke. Men den enda attributen kan göra en betydande skillnad i hur snabbt din Odoo-instans svarar när användare söker, filtrerar eller navigerar i stora datamängder.


Denna guide går igenom vad ett indexerat fält faktiskt är i sammanhanget av Odoo-datamodellen, hur det påverkar din databas och när det är meningsfullt att använda det i ditt eget Odoo-utvecklingsarbete. Oavsett om du bygger en anpassad modul eller granskar en befintlig implementering, kommer förståelsen av detta koncept att hjälpa dig att fatta bättre beslut.

Vad är ett indexerat fält i Odoo


I Odoo ORM deklareras ett fält som indexerat när dess definition inkluderar index=True. Detta säger till Odoo att be PostgreSQL att skapa ett B-trädindex på den motsvarande databas kolumnen när modulen installeras eller uppdateras.


Här är ett enkelt exempel från en Odoo-fältdefinition i Python:

class SaleOrder(models.Model):
    _name = 'sale.order'

    reference = fields.Char(string='Referens', index=True)
    state = fields.Selection([...], index=True)
    partner_id = fields.Many2one('res.partner', index=True)

Ur ett användargränssnittsperspektiv finns det inget synligt om indexerade fält. En användare som fyller i ett formulär eller bläddrar i en lista har ingen möjlighet att veta om ett fält är indexerat eller inte. Indexeringen är helt och hållet en databasnivåfråga.


Vad det påverkar är hastighet. När ett fält är indexerat kan PostgreSQL söka efter matchande poster mycket snabbare, särskilt i tabeller med tusentals eller miljoner rader. Utan ett index måste databasen skanna varje rad i tabellen för att hitta de som matchar dina sökkriterier. Med ett index navigerar den en sorterad struktur och hittar resultaten direkt.


Vilka Odoo-fälttyper stöder index=True

De flesta skalära fälttyper i Odoo ORM stöder index-attributet:

  • Char och Text fält
  • Integer och Float fält
  • Date och Datetime fält
  • Selection fält
  • Many2one fält (mycket vanligt indexerade)
  • Boolean fält

Relationsfält som One2many och Many2many har inte en direkt kolumn att indexera på samma sätt, så index-attributet är inte relevant för dem. Beräknade fält som inte är lagrade kan inte heller indexeras, eftersom de inte har en databas kolumn.

Hur fältet fungerar


När Odoo initierar eller uppgraderar en modul läser den alla fältdefinitioner och synkroniserar databasens schema. För varje fält med index=True utför Odoo ett SQL-uttalande för att skapa ett index på den kolumnen i PostgreSQL.


Som standard skapar PostgreSQL ett B-trädindex, vilket är den standardindex typ som fungerar bra för likhetsjämförelser (=), intervallfrågor (>, <, BETWEEN) och sortering. Detta täcker den stora majoriteten av vad Odoo gör när det filtrerar poster i listvyer eller beräknar domänbaserade sökningar.


Hur det interagerar med Odoo ORM

Odoo ORM översätter Python domänfilter till SQL-frågor. När du skriver en domän som [('state', '=', 'sale')] genererar ORM något som WHERE state = 'sale'. Om state-fältet har ett index använder PostgreSQL det för att effektivt lösa det villkoret utan att skanna hela tabellen.


Many2one-fält är en mycket vanlig användning. I Odoos datamodell lagrar ett fält som partner_id på en försäljningsorder det heltal ID för den relaterade partnern. När du öppnar listan över beställningar filtrerade efter kund kör Odoo en fråga med ett WHERE partner_id = X-villkor. Med ett index på partner_id är den uppslaget snabbt även med hundratusentals beställningar i databasen.


Index och skrivprestanda

Index är inte gratis. Varje gång en post skapas, uppdateras eller tas bort, behöver PostgreSQL uppdatera alla index på den tabellen också. På tabeller med många index tar skrivoperationer något längre tid. För de flesta Odoo-användningsfall är denna avvägning värt det, men det är värt att förstå att indexering av allt inte alltid är rätt svar.

Alternativet index='trigram'

I Odoo 16 och senare versioner accepterar index-attributet inte bara True utan också strängvärdet 'trigram'. Detta skapar ett GIN trigram-index med hjälp av pg_trgm PostgreSQL-tillägget, som stöder snabb mönstermatchning med ILIKE-frågor. Detta är särskilt användbart för textsökning på fält som produktnamn eller partnernamn där användare ofta skriver delsträngar i sökfältet.


name = fields.Char(string='Product Name', index='trigram')

Detta är ett mer avancerat alternativ som används i Odoos egna standardmoduler för fält som ofta söks efter deltext.

Affärsanvändningsfall


Indexerade fält dyker upp i många verkliga Odoo-arbetsflöden. Här är fem praktiska exempel där indexering av ett fält gör en märkbar skillnad.


1. CRM: Filtrera Leads efter Säljare

I CRM filtrerar försäljningschefer regelbundet pipelinen efter säljare. Fältet user_idcrm.lead är indexerat som standard i Odoo, vilket gör att filtrering efter säljare går snabbt även med tusentals leads. Om du lägger till ett anpassat Many2one-fält som pekar på en användare eller ett team, följer indexeringen samma logik.


2. Försäljning: Söka Order efter Status

Fältet statesale.order är indexerat. Detta är vad som gör att listan över bekräftade order laddas snabbt, eller filtrering av order som väntar på leverans, för företag som hanterar stora volymer. Urvalsfält som ofta används som filtreringskriterier är bra kandidater för indexering.


3. Lager: Spåra Rörelser efter Produkt

Lagerflyttningar i Odoo kan växa till mycket stora volymer, särskilt inom distributions- eller tillverkningsföretag. Fältet product_idstock.move är indexerat, vilket gör det effektivt att fråga alla rörelser för en specifik produkt. Utan detta index skulle produktspårningsrapporter bli plågsamt långsamma i hektiska lager.


4. Bokföring: Filtrera Verifikationsrader efter Partner

Revisorer öppnar ofta huvudboken för en specifik kund eller leverantör. Fältet partner_idaccount.move.line är indexerat för att göra dessa uppslag effektiva. I företag med flera års bokföringshistorik är detta index vad som hindrar rapporten över förfallna fordringar från att tidsöverskrida.


5. Anpassade Moduler: Referensfält för Spårbarhet

När man bygger anpassade moduler är det vanligt att lägga till referensfält som kopplar poster över modeller, till exempel en anpassad projektkod eller ett externt dokumentnummer. Om användare regelbundet kommer att söka eller filtrera efter det referensfältet, är det en enkel lösning att lägga till index=True för att hålla dessa sökningar snabba i takt med att datan växer.


Skapa eller anpassa ett indexerat fält


I Python (Utveckling av Anpassade Moduler)

Att lägga till index=True i en fältdefinition i en Python-modul är enkelt. Du inkluderar det helt enkelt som ett nyckelargument när du deklarerar fältet:


from odoo import models, fields

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_external_ref = fields.Char(
        string='Extern referens',
        index=True,
        help='Referensnummer från det externa systemet'
    )

Efter att ha lagt till detta fält i din modul, kör odoo-bin -u your_module_name eller uppgradera modulen via Apps-menyn. Odoo kommer att upptäcka det nya fältet och skapa motsvarande index i databasen.


Du kan också lägga till ett index till ett befintligt fält genom att ärva det och åsidosätta definitionen, även om detta tillvägagångssätt kräver försiktighet för att undvika oavsiktliga bieffekter på det ursprungliga fältets beteende.


I Odoo Studio

Odoo Studio låter icke-tekniska användare skapa fält genom gränssnittet. Men Studio erbjuder för närvarande inte ett alternativ för att aktivera eller inaktivera indexering när fält skapas. Fält som skapats genom Studio lagras i databasen som manuella fält och har inte index=True inställt som standard.


Om du behöver att ett Studio-skapat fält ska indexeras av prestandaskäl, är den renaste vägen att konvertera Studio-anpassningen till en riktig Python-modul och lägga till index=True i koden. Detta faller under teknisk anpassning och hanteras vanligtvis av en Odoo-utvecklare snarare än en Studio-användare.


Lägga till ett index direkt i PostgreSQL

I vissa situationer, som när man optimerar en befintlig produktionsdatabas utan en moduluppgradering, kan en databasadministratör lägga till ett index direkt med SQL:

CREATE INDEX CONCURRENTLY idx_sale_order_partner_id
ON sale_order (partner_id);

Att använda CONCURRENTLY undviker att låsa tabellen under indexskapandet, vilket är viktigt i produktionsmiljöer. Det sagt, detta tillvägagångssätt bör koordineras med Odoo-moduldefinitionen för att hålla Python-koden och databasen i synk. Om modulen senare uppgraderas kan Odoo hantera indexet eller inte beroende på vad som finns i fältdefinitionen.


Bästa praxis


Indexfält som visas i sökdomen

Om ett fält regelbundet används i domänfilter, antingen i listvyer, automatiserade åtgärder, schemalagda jobb eller beräknade fältberoenden, är det en bra kandidat för indexering. De vanligaste exemplen är Many2one-relationella fält, statusfält och referens- eller kodfält.


Följ Odoos egna konventioner

Den bästa referensen för när man ska använda index=True är Odoos egen källkod. Titta på de standardfältdefinitioner i sale.order, account.move eller stock.move för att se vilka fält Odoos egna utvecklare valde att indexera. Dessa val baseras på verkliga användningsmönster och prestandadata från tusentals produktionsdatabaser.


Indexera alltid Many2one-fält på högvolymmodeller

För modeller som ackumulerar ett stort antal poster över tid (journalposter, lagerflyttningar, försäljningsorderlinjer), indexera alltid Many2one-fält som används för filtrering. Kostnaden för ett extra index på en skrivtung tabell är nästan alltid värt förbättringen av läsprestanda.


Överväg trigramindexering för text sökfält

I Odoo 16 och senare, om användare ofta söker efter poster genom att skriva delsträngar i ett Char-fält som ett produktnamn, partnernamn eller dokumentreferens, överväg att använda index='trigram' istället för standard B-trädindexet. Trigramindex är specifikt utformade för ILIKE-mönstermatchning.


Verifiera att index faktiskt används

Efter att ha lagt till ett index kan du verifiera att PostgreSQL använder det genom att köra en EXPLAIN ANALYZE på frågan. Om frågeplaneraren fortfarande väljer en sekventiell skanning kan tabellen vara för liten för att indexet ska vara fördelaktigt, eller så kanske frågevillkoren inte är kompatibla med indexets typ.


Dokumentera dina indexeringsbeslut

När du bygger anpassade moduler, lämna en kort kommentar som förklarar varför ett fält är indexerat. Detta hjälper framtida utvecklare och konsulter att förstå avsikten och undvika att av misstag ta bort indexet under en refaktorering.

Vanliga fallgropar


Indexera varje fält som standard

Ett vanligt misstag när man lär sig om indexering är att lägga till index=True på varje fält bara för att vara på den säkra sidan. Detta är kontraproduktivt. Varje index tar upp lagringsutrymme och lägger till overhead på varje skrivoperation. På tabeller som får en hög volym av insättningar eller uppdateringar kan onödiga index märkbart sakta ner systemet.


Indexering av fält på små tabeller

På tabeller med några hundra rader beslutar PostgreSQL:s frågeplanerare ofta att en sekventiell skanning är snabbare än att använda ett index. Index börjar ge verklig nytta när tabeller växer till tusentals poster och mer. Att indexera små uppslagstabeller eller sällan befolkade anpassade modeller lägger till komplexitet utan något praktiskt värde.


Att glömma att uppgradera modulen efter att ha lagt till index=True

Att helt enkelt lägga till index=True i en fältdefinition i Python skapar inte automatiskt indexet i databasen. Du behöver uppgradera modulen med -u module_name eller genom Odoo-backend. Att glömma detta steg är en vanlig källa till förvirring under utvecklingen och kan leda till prestandaproblem i staging- eller produktionsmiljöer där uppgraderingen har hoppats över.


Att förvänta sig att index ska snabba upp ILIKE-sökningar på teckenfält

Ett vanligt B-trädindex med index=True hjälper inte med ILIKE '%keyword%'-frågor där wildcardet är i början av mönstret. PostgreSQL kan inte använda ett B-trädindex för att utvärdera ett ledande wildcard. Om du behöver snabb partiell textsökning, använd index='trigram' på Odoo 16+ eller utforska alternativ för fulltextsökning.


Att inte överväga beräknade lagrade fält

Lagrade beräknade fält (de med store=True) har faktiskt en databas kolumn och kan indexeras. Utvecklare förbiser ibland detta och missar en möjlighet att förbättra prestanda på fält som aggregerar eller härleder värden som används flitigt i filter. Om ett lagrat beräknat fält förekommer i domänfilter över rapporter eller vyer, är det värt att överväga att indexera det.

Slutsats


Attributet index=True är en liten detalj i Odoo-fältdefinitionen, men det har en verklig inverkan på databasens prestanda när din data växer. Använt korrekt håller det sökningar snabba, listvyer responsiva och rapporter snabba att generera. Använt vårdslöst, lägger det till overhead utan någon fördel.


Huvudpoängen är enkel: indexera fält som regelbundet används i domänfilter, särskilt Many2one-fält på modeller med hög volym. Följ mönstren som sätts av Odoo:s egna standardmoduler. Undvik överindexering av små tabeller eller fält som aldrig filtreras på. Och om du är på Odoo 16 eller senare, överväg index='trigram' för textsökningsfält där användare skriver delsträngar.


Att få indexeringsstrategin rätt från början av ett anpassat utvecklingsprojekt är mycket lättare än att diagnostisera långsamma frågor i produktion senare.

Arbetar du med en Odoo-implementering?


På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo. Oavsett om du bygger anpassade moduler, förbättrar prestandan på en befintlig instans eller planerar ett nytt Odoo-projekt från grunden, tar vi med oss praktisk teknisk expertis till varje engagemang.


Om du har problem med långsamma frågor, komplexa anpassningar eller behöver vägledning om bästa praxis för Odoo-utveckling, hjälper vi gärna till. Kontakta Dasolo-teamet och låt oss veta vad du arbetar med.

Indexerat Fält i Odoo: En Praktisk Guide för Utvecklare och Konsulter
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar