Uit mijn eigen onderzoek (maar ik ben geen deskundige DBA) heb ik geleerd dat er twee dingen zijn om te overwegen bij het bepalen van de volgorde van een samengestelde sleutelindex.
Ten eerste, wat betreft de kardinaliteit van kolommen, is index over het algemeen beter in het zoeken naar kolommen met een hoge kardinaliteit. Ik zou dus geneigd zijn om de kolom met de hoogste kardinaliteit eerst in de index te plaatsen. Ter referentie:er is een artikel met de titel MySQL Query Optimization dat zegt:
In jouw geval, de _id
kolommen zouden duidelijk beter in die definitie passen, dus zijn ze een betere kandidaat om een prefix van de sleutel te zijn.
Een ander ding om te overwegen is de herbruikbaarheid van deze indexen. De meeste (zo niet alle) databasesystemen staan toe dat een voorvoegsel van een samengestelde sleutel opnieuw wordt gebruikt. Bijvoorbeeld een samengestelde sleutel op (owner_id, owner_type)
kan ook worden gebruikt door zoekopdrachten op owner_id
maar niet op owner_type
.
Dus van wat je in je vraag hebt uitgelegd, ben je misschien beter af met twee indexen:een samengestelde sleutelindex op (owner_id, owner_type)
en een andere op (owner_type)
.
Ten slotte komt het echt allemaal neer op uw dataset en query's. Probeer meerdere scenario's, benchmarks uit met verschillende samengestelde sleutelvolgorde om te zien wat de meest optimale oplossing is. Vergeet ook niet dat indexen een schrijfstraf met zich meebrengen op uw tafels.
Bijwerken :Er is ook een andere nogal populaire SO-vraag over samengestelde sleutelindexen:
Wanneer moet ik een samengestelde index gebruiken?