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

MySql-forespørgsel meget langsom

Forskellen i ydeevne er muligvis på grund af e.id_dernier_fichier være i indekset brugt til JOIN, men e.codega ikke være i det indeks.

Uden en fuldstændig definition af begge tabeller og alle deres indekser, er det ikke muligt at sige med sikkerhed. Det ville også hjælpe at inkludere de to EXPLAIN PLANs for de to forespørgsler.


Indtil videre kan jeg dog uddybe et par ting...

Hvis et INDEX er KLUSTERET (dette gælder også for PRIMÆRE NØGLER), lagres dataene faktisk fysisk i rækkefølgen af ​​INDEX. Det betyder, at du ved, at du vil have position x i INDEX betyder implicit også, at du vil have position x i TABELLEN.

Hvis INDEX ikke er grupperet, giver INDEX kun et opslag til dig. Effektivt at sige position x i INDEX svarer til position y i TABELLEN.

Vigtigheden her er, når du får adgang til felter, der ikke er angivet i INDEX. Dette betyder, at du rent faktisk skal gå til TABELLEN for at få dataene. I tilfælde af et CLUSTERED INDEX, er du allerede der. Overheaden ved at finde det felt er ret lav. Hvis INDEKSEN ikke er klynget, er du imidlertid nødt til at JOIN TABELLEN til INDEKS og derefter finde det felt, du er interesseret i.


Bemærk; At have et sammensat indeks på (id_dernier_fichier, codega) er meget anderledes end at have ét indeks på bare (id_dernier_fichier) og et separat indeks på bare (codega) .


I tilfælde af din forespørgsel, tror jeg ikke, du behøver at ændre koden overhovedet. Men du drage fordel af at ændre indekserne.

Du nævner, at du vil have adgang til mange felter. At sætte alle disse felter i et sammensat indeks er sandsynligvis ikke den bedste løsning. I stedet vil du måske oprette et CLUSTERED INDEX på (id_dernier_fichier) . Dette vil betyde, at når *id_dernier_fichier* er blevet lokaliseret, er du allerede på det rigtige sted for også at få alle de andre felter.


REDIGER Note om MySQL og CLUSTERED INDEXES

13.2.10.1. Klyngede og sekundære indekser

Hver InnoDB-tabel har et specielt indeks kaldet det klyngede indeks, hvor dataene for rækkerne er gemt:

  • Hvis du definerer en PRIMÆR NØGLE på din tabel, bruger InnoDB den som det klyngede indeks.
  • Hvis du ikke definerer en PRIMÆR NØGLE til din tabel, vælger MySQL det første UNIQUE indeks, der kun har IKKE NULL-kolonner som den primære nøgle, og InnoDB bruger det som det klyngede indeks.
  • Hvis tabellen ikke har en PRIMÆR NØGLE eller et passende UNIKT indeks, genererer InnoDB internt et skjult klynget indeks på en syntetisk kolonne, der indeholder række-id-værdier. Rækkerne er ordnet efter det ID, som InnoDB tildeler rækkerne i en sådan tabel. Række-id'et er et 6-byte felt, der øges monotont, efterhånden som nye rækker indsættes. Således er rækkerne ordnet efter række-id'et fysisk i indsættelsesrækkefølge.



  1. Sådan reviderer du en PostgreSQL-database

  2. Konfig SQL*Plus for ikke at returnere andet end data

  3. MySQLdb forbindelsesproblemer

  4. EF Core GroupBy med Select Distinct Count