Inledning
Om du har arbetat med Odoo länge har du säkert sett index=True i fältdefinitioner — en liten inställning som ofta förbises, men som kan förändra hur snabbt systemet svarar när användarna söker eller filtrerar stora datamängder.
Den här guiden förklarar vad det innebär att ett fält är indexerat i Odoos datamodell, hur det påverkar databasen och när du bör använda det i egna moduler eller anpassningar. Lär dig känna igen tillfällen där ett index ger verklig nytta och när det bara innebär onödig overhead.
Vad betyder ett indexerat fält i Odoo?
I Odoo markeras ett fält som indexerat genom att ange index=True i fältdefinitionen. Det säger åt Odoo att begära en indexstruktur i PostgreSQL för kolumnen när modulen installeras eller uppgraderas.
Här följer en enkel illustration som visar hur man deklarerar ett indexerat fält i en Python-modul.
class SaleOrder(models.Model):
_name = 'sale.order'
reference = fields.Char(string='Reference', index=True)
state = fields.Selection([...], index=True)
partner_id = fields.Many2one('res.partner', index=True)
Indexering syns inte i användargränssnittet — ingen flagga eller ikon visas för slutanvändaren. Det är en underliggande databasoptimering som inte påverkar formulärens utseende, bara hur snabbt data hittas och hämtas.
Huvudeffekten är prestanda. Ett index låter PostgreSQL hitta matchande rader utan att gå igenom hela tabellen, vilket gör sökningar och filter mycket snabbare när tabellen växer till tusentals eller miljoner rader.
Vilka fälttyper i Odoo kan indexeras
De flesta enkla fälttyper i Odoo kan få en indexering via index-attributet.
- Char- och Text-fält
- Integer- och Float-fält
- Date- och Datetime-fält
- Selection-fält
- Many2one-fält (vanligtvis indexerade)
- Boolean-fält
Relationstyper som One2many och Many2many motsvarar inte en enda databaskolumn, så index är inte tillämpligt för dem. Beräknade fält som inte lagras i databasen kan inte indexeras eftersom det saknas fysisk kolumn.
Hur indexeringen fungerar i praktiken
När Odoo installerar eller uppgraderar en modul jämförs fältdefinitionerna med databasschemat. För fält med index=True körs en SQL-kommandosträng som skapar ett index i PostgreSQL för den kolumnen.
Som standard skapas ett B-tree-index i PostgreSQL. B-tree är generellt lämpat för likhetskontroller, intervallfrågor och sortering — det täcker de flesta vanliga filtreringar som Odoo gör.
Hur indexen används av Odoo ORM
När du skriver domäner i Python översätter ORM dem till SQL WHERE-villkor. Exempelvis blir [('state', '=', 'sale')] till WHERE state = 'sale'. Om kolumnen är indexerad kan databasen använda indexet för snabb uppslagning i stället för att läsa hela tabellen.
Many2one-fält är ett typiskt exempel: ett fält som partner_id lagrar ett id till en partner. När du filtrerar orderlistan på en kund utförs en WHERE partner_id = X-fråga — med index blir sökningen snabb även i mycket stora dataset.
Indexens påverkan på skrivprestanda
Index kommer med en kostnad: varje insättning, uppdatering eller borttagning måste också uppdatera alla tillhörande index. På tabeller med många index kan skrivoperationer bli märkbart långsammare, så man behöver balansera läs- och skrivbehov.
Alternativet index='trigram'
Från Odoo 16 finns möjlighet att ange index='trigram'. Det skapar ett GIN trigram-index via PostgreSQL-tillägget pg_trgm och ger mycket bättre prestanda för ILIKE-mönstersökningar, alltså när användare söker med delsträngar.
name = fields.Char(string='Product Name', index='trigram')
Det här är ett mer avancerat val som används för sökfält där användarna ofta skriver bara delar av namnet, till exempel produkt- eller kundnamn.
När index hjälper i verkliga företagsscenarier
Praktiska exempel där index gör skillnad
1. CRM: Filtrera leads per säljare
I CRM filtrerar chefer ofta pipeline efter ansvarig säljare. Fältet user_id på crm.lead är indexerat, vilket gör dessa vyer snabba även vid stora mängder leads. Samma princip gäller för egna Many2one-fält som pekar på användare eller team.
2. Försäljning: Söka order per status
Statusfältet (state) på försäljningsorder är indexerat för att snabbt visa bekräftade order eller de som väntar på leverans. Selection-fält som ofta används i filter är bra kandidater för indexering.
3. Lager: Spåra rörelser per produkt
I lagerhantering växer tabeller med lagerrörelser snabbt. Att indexera product_id på stock.move gör det möjligt att snabbt ta fram alla rörelser för en viss artikel — viktigt i stora distributionsmiljöer.
4. Redovisning: Visa verifikationer per partner
Revisorer och ekonomer öppnar ofta bokföringsposter för specifika kunder eller leverantörer. Ett index på partner_id i account.move.line gör sådana uppslag effektiva även med årsdata sparad.
5. Egna moduler: Referensfält för spårbarhet
I egna moduler är det vanligt att lägga in referensnummer eller externa id:n. Om användare ofta söker eller filtrerar på sådana fält lönar det sig att lägga till index=True för att bevara prestanda när datan växer.
Så skapar och anpassar du ett indexerat fält
Hur du lägger till index i Python (egen modul)
Att ange index=True i en fältdeklaration är enkelt: lägg till argumentet när du skapar fältet i din modell.
from odoo import models, fields
class ProjectTask(models.Model):
_inherit = 'project.task'
x_external_ref = fields.Char(
string='External Reference',
index=True,
help='Reference number from the external system'
)
Efter att du lagt till fältet uppdaterar du modulen med odoo-bin -u your_module_name eller via Appar i backend. Odoo upptäcker fältet och skapar indexet i databasen vid uppgraderingen.
Du kan också ärva ett befintligt fält och lägga till index, men det kräver försiktighet så att ändringen inte påverkar ursprungliga beteenden oväntat.
Indexering via Odoo Studio
Odoo Studio låter icke-tekniska användare skapa fält i gränssnittet, men det erbjuder inte ett val för att slå på index. Studio-fält sparas som manuella fält utan index=True per automatik.
Om ett Studio-skapad fält behöver indexeras är rekommendationen att omvandla anpassningen till en riktig Python-modul och lägga in index=True där — en uppgift för en Odoo-utvecklare.
Skapa index direkt i PostgreSQL
I produktionsmiljöer där du optimerar befintliga databaser kan en DBA skapa index direkt med SQL.
CREATE INDEX CONCURRENTLY idx_sale_order_partner_id
ON sale_order (partner_id);
Genom att använda CONCURRENTLY undviker du att låsa tabellen vid skapandet, vilket är viktigt i drift. Koordinera dock alltid sådana åtgärder med kodbasen — annars kan framtida moduluppgraderingar leda till oenighet mellan kod och databasstruktur.
Riktlinjer för smart indexering
Indexera fält som används i domäner och filter
Fält som ofta dyker upp i domäner — listfilter, automatiska åtgärder, schemalagda jobb eller som beroenden i beräknade fält — är bra kandidater för indexering. Typiska exempel är Many2one, statusfält och referenskoder.
Ta lärdom av Odoos egna konventioner
Ett av de bästa sätten att avgöra vilka fält som bör indexeras är att studera Odoos standardmoduler. Fälten som utvecklarna valt att indexera i moduler som sale.order, account.move och stock.move speglar verkliga användningsmönster.
Indexera alltid Many2one på volymtunga modeller
För modeller som växer mycket över tid (bokföringsposter, lagerrörelser, försäljningsorder) är det nästan alltid rätt att indexera Many2one-fält som används vid filtrering. Kostnaden i skrivprestanda betalar sig ofta i snabbare läsningar.
Överväg trigram för textfält
På Odoo 16+ bör du fundera på index='trigram' för fält där användare skriver delsträngar — till exempel produkt- eller kundnamn — eftersom trigram-index är optimerade för sådana ILIKE-sökningar.
Kontrollera att index faktiskt används
Efter att du lagt till ett index kan du köra EXPLAIN ANALYZE på frågorna för att se om PostgreSQL använder indexet. Ibland väljer planner en sekventiell genomsökning om tabellen är liten eller villkoren inte matchar indexets användningsmönster.
Dokumentera varför du indexerar
Lämna en kort kommentar i koden om varför ett fält har index=True. Det hjälper framtida utvecklare att förstå syftet och minskar risken att index tas bort vid refaktorering.
Vanliga misstag att undvika
Att indexera allt av vana
Ett vanligt misstag är att sätta index=True på varje fält “för säkerhets skull”. Varje index tar plats och gör skrivningar dyrare — på tabeller med hög skrivfrekvens kan onödiga index sänka systemet.
Index på små tabeller ger sällan vinst
På tabeller med bara några hundra rader föredrar PostgreSQL ofta sekventiell sökning framför index. Index ger verklig fördel först när volymerna når tusentals rader och uppåt, så undvik att indexera små uppslagslistor i onödan.
Glömma moduluppgradering efter att ha lagt till index=True
Att bara ändra i Python-filen skapar inte indexet i databasen — du måste uppgradera modulen med -u module_name eller via backend. Att missa det är en vanlig källa till förvirring under utveckling.
Att tro att B-tree hjälper alla ILIKE-sökningar
Ett vanligt missförstånd är att ett vanligt B-tree-index hjälper ILIKE '%text%'-sökningar. B-tree kan inte användas vid ledande jokertecken. För snabba delsträngssökningar behövs index='trigram' eller fulltextlösningar.
Glömma lagrade beräknade fält
Beräknade fält som är lagrade (store=True) skapar fysiska kolumner och kan därför indexeras. Missa inte möjligheten att indexera sådana fält om de ofta förekommer i domäner eller rapporter.
Sammanfattning
Sammanfattningsvis: index=True är en liten inställning men med stor betydelse för prestanda. Rätt använd håller sökningar snabba och vyer responsiva; felaktigt användande ger bara onödig komplexitet och sänkt skrivprestanda.
Huvudregeln är enkel: indexera fält som ofta förekommer i domäner, särskilt Many2one på volymtunga modeller. Följ Odoos standardval, undvik överindexering på små tabeller och överväg index='trigram' för textfält i Odoo 16+ när användare söker med delsträngar.
Det är betydligt lättare att få indexstrategin rätt från början i ett utvecklingsprojekt än att felsöka långsamma frågor i produktion senare.
På gång med en Odoo-implementering?
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo. Oavsett om det handlar om att bygga skräddarsydda moduler, förbättra prestanda i en befintlig installation eller planera ett helt nytt Odoo-projekt, erbjuder vi handfast teknisk erfarenhet.
Om du kämpar med långsamma frågor, komplexa anpassningar eller behöver råd kring bästa praxis inom Odoo-utveckling så kan vi hjälpa till. Kontakta Dasolo-teamet och berätta vad ni jobbar med.