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

Optimering af forespørgsler baseret på klyngede og ikke-klyngede indekser i SQL?

Jeg kender ikke til interne funktioner i Microsoft SQL Server, men jeg kan svare for MySQL, som du taggede for dit spørgsmål. Detaljerne kan variere for andre implementeringer.

Q1. Højre, der kræves ingen ekstra plads til det klyngede indeks.

Hvad sker der, hvis du dropper det klyngede indeks? MySQL's InnoDB-motor bruger altid den primære nøgle (eller den første ikke-nul unikke nøgle) som det klyngede indeks. Hvis du definerer en tabel uden en primær nøgle, eller du dropper den primære nøgle i en eksisterende tabel, InnoDB genererer en intern kunstig nøgle til det klyngede indeks . Denne interne nøgle har ingen logisk kolonne til at referere til.

Q2. En rækkefølge af rækker, der returneres af en forespørgsel, der bruger et ikke-klynget indeks, er ikke garanteret. I praksis er det den rækkefølge, rækkerne blev tilgået i. Hvis du har brug for, at rækker skal returneres i en bestemt rækkefølge, skal du bruge ORDER BY i din forespørgsel. Hvis optimeringsværktøjet kan udlede, at din ønskede rækkefølge er den samme som rækkefølgen, hvori den vil få adgang til rækker (indeksrækkefølge, enten efter klynget eller ikke-klynget indeks), så kan den springe sorteringstrinnet over.

Q3. InnoDB ikke-klyngede indeks har ikke en pointer til den tilsvarende række ved et blad i indekset, det har værdien af den primære nøgle. Så et opslag i et ikke-klyngede indeks er i virkeligheden to B-træsøgninger, den første til at finde bladet af det ikke-klyngede indeks og derefter en anden søgning i det klyngede indeks.

Dette er det dobbelte af prisen for en enkelt B-træsøgning (mere eller mindre), så InnoDB har en ekstra funktion kaldet Adaptive Hash Index . Ofte søgte værdier cachelagres i AHI, og næste gang en forespørgsel søger efter en cachelagret værdi, kan den lave et O(1) opslag. I AHI-cachen finder den en pointer direkte til bladet i det klyngede indeks, så det eliminerer begge B-træ søgninger, en del af tiden.

Hvor meget dette forbedrer den samlede ydeevne afhænger af, hvor ofte du søger efter den eller de samme værdier, som er blevet søgt før. Efter min erfaring er det typisk, at forholdet mellem hash-søgninger og ikke-hash-søgninger er omkring 1:2.

Q4. Konstruer indekserne til at tjene de forespørgsler, du har brug for for at blive optimeret. Typisk er et klynget indeks en primær eller unik nøgle, og i det mindste i tilfælde af InnoDB er dette påkrævet. Hverken age heller ikke salary er sandsynligvis unik.

Du kan lide min præsentation, Hvordan man designer indekser, virkelig .

Spørgsmål 5. InnoDB opretter automatisk et indeks, når du erklærer en unik begrænsning. Du kan ikke have begrænsningen uden at der findes et indeks for den. Hvis du ikke havde et indeks, hvordan ville motoren så sikre unikhed, når du indsætter en værdi? Det ville være nødvendigt at søge i hele tabellen for en dubletværdi i den kolonne. Indekset hjælper med at gøre unikke kontroller meget mere effektive.



  1. Fordele ved pdo frem for mysql_* eller mysqli_*

  2. Tjek om mysql-databasen eksisterer, udfør handling baseret på resultatet

  3. 2-bords interaktion:indsæt, få resultat, indsæt

  4. Lær at udføre produktanalyse med SQL Server fuldtekstsøgning. Del 2