Hvad er forskellen mellem primært indeks og sekundært indeks nøjagtigt? Og hvad er fordelene ved hinanden?


Svar 1:

Lad mig først fortælle lighederne:

ligheder

  • Begge indeksstrukturer implementeres som separate førsteklasses objekter i databasen. Dette indebærer, at tabellen og dets tilsvarende indeks (primær eller sekundær) findes som to separate strukturer. Begge implementerer et indirekt niveau, hvor forespørgslerne først søger indekset, og bruger resultatet af denne opslag til direkte at hente den post, den peger på. Indeksblokke i begge typer indekser holder posterne sorteret; dvs. uanset hvilken indeksindgang der faktisk er → typisk a , indgange i indeksblokken sorteres altid på indeks / søgetasten.

Forskelle

Primært indeks

  • Et primært indeks påvirker lagring og organisering af rækker i datablokke. Datablokke er diskblokke, der lagrer de faktiske rækkedata (flere kolonner). Primært indeks kræver, at rækkerne i datablokke skal ordnes på indeksetasten. Så bortset fra at indeksindgange bliver sorteret i indeksblokken, håndhæver primærindeks også en rækkefølge af rækker i datablokkene. Nedenstående diagram, der er lånt fra "Databasesystemimplementering af Garcia Molina et al." viser, hvordan indeksindtastningerne i indeksblokkene (venstre side) indeholder pointere (dette er række-locatorer i databaseterminologi) til tilsvarende rækker i datablokke (højre side). Hver datablock har rækker i sorteret rækkefølge pr. Indeksetasten.
  • Primært indeks kan oprettes i både nøglekolonner og ikke-nøglekolonner. Der er ikke noget, da primært indeks kun er beregnet til primær nøgle. Men ja, normalt oprettes de på den primære nøgle i tabellen. Siden det primære indeks ændrer vejen (er nødt til at holde rækkerne sorteret) er data organiseret i en tabel, der kan højst være 1 primært indeks på en given tabel.

Sekundært indeks

  • Sekundært indeks har ingen indflydelse på, hvordan rækkerne faktisk er organiseret i datablokke. De kan være i enhver rækkefølge. Den eneste ordre er indtastningsnøglen i indeksblokke. Nedenstående diagram, der er lånt fra "Databasesystemimplementering af Garcia Molina et al." Viser, hvordan indeksindtastningerne i indeksblokke (venstre side) indeholder pegepunkter (dette er række-locatorer i databaseterminologi ) til tilsvarende rækker i datablokke (højre side). Datablokkene har ikke rækker sorteret på indeksetasten

Sammenligning

  • For det første kan brugeren definere flere sekundære indekser, fordi de ikke har nogen indflydelse på organiseringen af ​​rækker i tabellen. Men der kan kun være 1 primært indeks. Fordi det primære indeks ikke nødvendigvis skal være på den primære nøgle, kan det primære indeks også have duplikatindeksnøgler. Faktisk er eksemplet vist ovenfor for sekundært indeks for duplikatnøgler. Dette er almindeligt for begge. Selvfølgelig, hvis det primære indeks oprettes på den primære nøgle, kan der ikke være duplikatindeksnøgler, da den primære nøgle håndhæver en UNIK KONSTRAINT. Begge primære og sekundære indekser kan bruges til punktopslag og rækkefølgeforespørgsler. Men områdespørgsmål forventes at være hurtigere for det primære indeks i begge tilfælde - unik indeksnøgle og duplikatindeksnøgler. Punktopslag i tilfælde af NON UNIQUE-indeks forventes at være hurtigere med et primært indeks. Men hvis indekset er UNIK, bør punktopslag med primær- og sekundærindeks ideelt set tage den samme mængde tid - mindst samme mængde af I / O Årsagen er, at primærindeks tvinger rækkerne i datablokke, der skal bestilles. Så hvis brugeren er interesseret i at finde rækker til WHERE KEY> = 20 AND KEY <= 40, er der store chancer for at læse færre diskblokke og dermed mindre I / O. Det kan være muligt, at rækker, der svarer til disse nøgler, er i den samme datablokade (selvom indekset ikke er unikt). På den anden side har det sekundære indeks ikke kontrol over organisering af rækker. Så for det samme eksempel på at finde alle poster mellem 20 og 40, er det muligt, at poster (er), der svarer til hver nøgle, sidder i sin egen datablok. Dette indebærer naturligvis, at der vil være mere I / O, og at forespørgsler således kan være mindre effektive med sekundært indeks. For point-opslag med unikke indeksetaster, betyder det ikke rigtigt, om indekset er primært eller sekundært. Resultatet af opslag vil være en række-locator, og databasen skal under alle omstændigheder følge den for at komme til den faktiske post. Således vil en enkelt I / O være der. Fordi det primære indeks tvinger de rækker, der skal ordnes i datablokke, vil DML'er være mindre effektive. Da DML'er skal holde rækker i sorteret rækkefølge inden for en datablok, vil INSERT / UPDATE forårsage hyppig rækkebevægelse, medmindre brugeren sørger for, at indsættelser udføres i en rækkefølge. Enhver DML, der resulterer i en rækkebevægelse i en række i en data blokering kræver også en opdatering til den tilsvarende primære indeksstruktur siden indeksindgangen nu skal opdateres med en ny række locator (fordi rækken blev flyttet). Rækker bevægelse kræver også en opdatering til sekundær indeksstruktur, men sandsynligheden for at en INSERT forårsager en rækkebevægelse er relativt lav for det sekundære indeks, da INSERT gør behøver ikke at holde rækker i sorteret rækkefølge inden for en datablok. Tilfælde som række voksende i størrelse og derfor skal flyttes til alle sammen en anden blok er et af de få tilfælde af rækkebevægelse i sekundært indeks.

Svar 2:

Et primært indeks er en lagerstruktur, der indeholder de faktiske basisrader i tabellen i et B-træ-baseret lagerlayout. Indekset er typisk organiseret omkring PRIMÆRLE Nøglen, hvis der findes en sådan.

Primære indeks kaldes undertiden “klyngeindekser”, skønt ikke alle ting, der kaldes klyngerindekser, er “rigtige” primære indeksimplementeringer (dvs. den i PostgreSQL er ikke).

Langt de fleste lagringsmotorer lagrer basistabelrækker uden nogen særlig rækkefølge afledt af kolonnedata og implementerer ikke "ægte" primære indekser.

Kun nogle få DB-lagringsmotorer implementerer faktisk primære indekser. Oracle “Indeksorganiserede tabeller” og MySQL InnoDB er de mest anvendte lagermotorer, der implementerer primære indekser.

Den største fordel ved en indeksorganiseret opbevaringsstruktur er opslag på den PRIMÆRLE Nøgle kræver en enkelt "gåtur" af basis B-træet. I de fleste andre opbevaringsarrangementer kræver PRIMÆR Nøgleopslag to gåture: en til at slå basistabellægepekeren op i en sekundær indeksstruktur, der er bygget rundt om PK, og rækken henter sig selv.

I disse arrangementer er PK-opslag ikke billigere end opslag, der bruger noget andet indeks.

Da et primært indeks bruges til basistabelorganisationen, får du kun én pr. Tabel.

Den største ulempe ved primær indeksopbevaring i forhold til andre typer opbevaring er, at de kan være langsommere at indlæse, da hvert INDSÆT på basisbordet skal gå et B-træ for at finde ud af, hvor man skal placere rækken. Eftersom de fleste lagermotorer, der understøtter primære indekser, bruger den primære indeksetast som opslagidentifikator for sekundære indekser, kan du have sekundære indekser, der tager meget plads, hvis du har en lang PRIMÆRLE Nøgle (dvs. hvis du bruger noget som en Globalt unik identifikator som PK og har andre indekser).


Svar 3:

Et primært indeks er en lagerstruktur, der indeholder de faktiske basisrader i tabellen i et B-træ-baseret lagerlayout. Indekset er typisk organiseret omkring PRIMÆRLE Nøglen, hvis der findes en sådan.

Primære indeks kaldes undertiden “klyngeindekser”, skønt ikke alle ting, der kaldes klyngerindekser, er “rigtige” primære indeksimplementeringer (dvs. den i PostgreSQL er ikke).

Langt de fleste lagringsmotorer lagrer basistabelrækker uden nogen særlig rækkefølge afledt af kolonnedata og implementerer ikke "ægte" primære indekser.

Kun nogle få DB-lagringsmotorer implementerer faktisk primære indekser. Oracle “Indeksorganiserede tabeller” og MySQL InnoDB er de mest anvendte lagermotorer, der implementerer primære indekser.

Den største fordel ved en indeksorganiseret opbevaringsstruktur er opslag på den PRIMÆRLE Nøgle kræver en enkelt "gåtur" af basis B-træet. I de fleste andre opbevaringsarrangementer kræver PRIMÆR Nøgleopslag to gåture: en til at slå basistabellægepekeren op i en sekundær indeksstruktur, der er bygget rundt om PK, og rækken henter sig selv.

I disse arrangementer er PK-opslag ikke billigere end opslag, der bruger noget andet indeks.

Da et primært indeks bruges til basistabelorganisationen, får du kun én pr. Tabel.

Den største ulempe ved primær indeksopbevaring i forhold til andre typer opbevaring er, at de kan være langsommere at indlæse, da hvert INDSÆT på basisbordet skal gå et B-træ for at finde ud af, hvor man skal placere rækken. Eftersom de fleste lagermotorer, der understøtter primære indekser, bruger den primære indeksetast som opslagidentifikator for sekundære indekser, kan du have sekundære indekser, der tager meget plads, hvis du har en lang PRIMÆRLE Nøgle (dvs. hvis du bruger noget som en Globalt unik identifikator som PK og har andre indekser).


Svar 4:

Et primært indeks er en lagerstruktur, der indeholder de faktiske basisrader i tabellen i et B-træ-baseret lagerlayout. Indekset er typisk organiseret omkring PRIMÆRLE Nøglen, hvis der findes en sådan.

Primære indeks kaldes undertiden “klyngeindekser”, skønt ikke alle ting, der kaldes klyngerindekser, er “rigtige” primære indeksimplementeringer (dvs. den i PostgreSQL er ikke).

Langt de fleste lagringsmotorer lagrer basistabelrækker uden nogen særlig rækkefølge afledt af kolonnedata og implementerer ikke "ægte" primære indekser.

Kun nogle få DB-lagringsmotorer implementerer faktisk primære indekser. Oracle “Indeksorganiserede tabeller” og MySQL InnoDB er de mest anvendte lagermotorer, der implementerer primære indekser.

Den største fordel ved en indeksorganiseret opbevaringsstruktur er opslag på den PRIMÆRLE Nøgle kræver en enkelt "gåtur" af basis B-træet. I de fleste andre opbevaringsarrangementer kræver PRIMÆR Nøgleopslag to gåture: en til at slå basistabellægepekeren op i en sekundær indeksstruktur, der er bygget rundt om PK, og rækken henter sig selv.

I disse arrangementer er PK-opslag ikke billigere end opslag, der bruger noget andet indeks.

Da et primært indeks bruges til basistabelorganisationen, får du kun én pr. Tabel.

Den største ulempe ved primær indeksopbevaring i forhold til andre typer opbevaring er, at de kan være langsommere at indlæse, da hvert INDSÆT på basisbordet skal gå et B-træ for at finde ud af, hvor man skal placere rækken. Eftersom de fleste lagermotorer, der understøtter primære indekser, bruger den primære indeksetast som opslagidentifikator for sekundære indekser, kan du have sekundære indekser, der tager meget plads, hvis du har en lang PRIMÆRLE Nøgle (dvs. hvis du bruger noget som en Globalt unik identifikator som PK og har andre indekser).