Hoppa till innehåll

Indexed Field i Odoo – Praktisk Guide för Utvecklare och Konsulter

Indexering i Odoo ORM: hur det fungerar, när du ska använda det och vad det betyder för databasens prestanda I Odoo handlar indexat data om att göra sökningar snabbare i databasen. Ett index är en separat struktur som databasen använder för att hitta poster utan att skanna hela tabellen. När du lägger till index-flaggan (index=True) på ett fält i modelldefinitionen instruerar du PostgreSQL att bygga ett index för den kolumnen — vilket ofta ger betydande prestandvinster för läsintensiva operationer. När ska du använda index? - Fält som ofta förekommer i domänvillkor eller i sökningar (t.ex. ['|', ('partner_id', '=', X), ('state', '=', 'paid')]) är bra kandidater. - Kolumner som används i JOIN-villkor mellan modeller. - Fält som är del av ORDER BY eller GROUP BY i frekvent använda vyer eller rapporter. När bör du undvika index? - För små tabeller tillför index sällan vinst eftersom helskanning är billig. - För fält som uppdateras mycket ofta (t.ex. timestamp-fält som skrivs vid varje ändring) kan index försämra skrivprestanda eftersom indexet måste uppdateras vid varje INSERT/UPDATE. - För fält med mycket låg kardinalitet (t.ex. boolean eller status med få möjliga värden) ger index ofta liten hjälp. Effekter på prestanda - Läsningar (SELECT) kan bli mycket snabbare med rätt index, särskilt på stora tabeller. - Skrivningar (INSERT/UPDATE/DELETE) kan bli långsammare eftersom indexet måste hållas synkroniserat. - Index ökar även lagringsbehovet och kan påverka underhållsåtgärder (VACUUM/ANALYZE). Typer av index som är relevanta i Odoo - B-tree: standard för likhets- och sorteringssökningar. - Hash: sällan använd i PostgreSQL i praktiken; vanligen används inte i Odoo. - GIN/GiST: användbara för fulltextsökning eller för fält som lagrar arrays/JSONB. Praktiska råd - Indexera fält som används ofta i domäner och som har hög selektivitet. - Använd composite indexes (index på flera kolumner) om frågor ofta filtrerar på samma kombination av fält. - Övervaka med EXPLAIN/ANALYZE för att se hur frågeplaner faktiskt använder index. - Testa prestanda i en staging-miljö med realistiska datavolymer innan du rullar ut ändringar i produktion. Sammanfattning Rätt använd ger index i Odoo ORM stora vinster i läsprestanda, men de är inte gratis: de påverkar skrivhastighet, lagringsutrymme och underhåll. Planera vilka fält som behöver index utifrån hur applikationen faktiskt frågar databasen, använd EXPLAIN för att verifiera och föredra sammansatta index när flera fält ofta används tillsammans i filter.
6 mars 2026 av
Indexed Field i Odoo – Praktisk Guide för Utvecklare och Konsulter
Dasolo
| Inga kommentarer ännu

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_idcrm.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_idstock.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.

Indexed Field i Odoo – Praktisk Guide för Utvecklare och Konsulter
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar