sql >> Database teknologi >  >> RDS >> Mysql

performant bestilling af nøgler i et MySQL sammensat indeks (WRT Rails Polymorphic associations og STI)

Fra min egen forskning (men jeg er ingen ekspert DBA) har jeg lært, at der er to ting at overveje, når man beslutter rækkefølgen af ​​et sammensat nøgleindeks.

For det første, hvad angår kolonnernes kardinalitet, er indeks generelt bedre til at søge efter kolonner med høj kardinalitet. Så jeg ville være tilbøjelig til at placere kolonnen med den højeste kardinalitet først i indekset. Til reference er der en artikel med titlen MySQL Query Optimization der siger:

I dit tilfælde er _id kolonner ville klart passe bedre til denne definition, og derfor er de en bedre kandidat til at være et præfiks for nøglen.

En anden ting at overveje ville være genanvendeligheden af ​​disse indekser. De fleste (hvis ikke alle) databasesystemer tillader, at et præfiks for en sammensat nøgle genbruges. For eksempel en sammensat nøgle på (owner_id, owner_type) kan også bruges af forespørgsler på owner_id men ikke på owner_type .

Så ud fra det, du forklarede i dit spørgsmål, er du måske bedre stillet med to indekser:et sammensat nøgleindeks på (owner_id, owner_type) og en anden på (owner_type) .

Endelig kommer det hele virkelig ned til dit datasæt og dine forespørgsler. Prøv flere scenarier, benchmarks ved hjælp af forskellige sammensatte nøgler for at se, hvad der er den mest optimale løsning. Glem heller ikke, at indekser medfører en skrivestraf på dine borde.

Opdater :Der er også et andet ret populært SO-spørgsmål om sammensat nøgleindeks der:

Hvornår skal jeg bruge et sammensat indeks?



  1. Gruppér efter alias (Oracle)

  2. Mysql udtræk det første bogstav i hvert ord i en bestemt kolonne

  3. JSON til MYSQL - er JSON-svar formateret korrekt - looper korrekt?

  4. ROW_NUMBER() i MySQL