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

Hvordan fungerer indeksering

Hvad gør indeksering?

Indeksering er måden at få en uordnet tabel i en rækkefølge, der vil maksimere forespørgslens effektivitet under søgning.

Når en tabel er uindekseret, vil rækkefølgen af ​​rækkerne sandsynligvis ikke kunne skelnes af forespørgslen som optimeret på nogen måde, og din forespørgsel bliver derfor nødt til at søge gennem rækkerne lineært. Med andre ord, forespørgslerne skal søge gennem hver række for at finde de rækker, der matcher betingelserne. Som du kan forestille dig, kan dette tage lang tid. At kigge igennem hver enkelt række er ikke særlig effektivt.

For eksempel repræsenterer tabellen nedenfor en tabel i en fiktiv datakilde, som er fuldstændig uordnet.

virksomheds-id enhed enhedspris
10 12 1.15
12 12 1.05
14 18 1.31
18 18 1.34
11 24 1.15
16 12 1.31
10 12 1.15
12 24 1.3
18 6 1.34
18 12 1.35
14 12 1,95
21 18 1.36
12 12 1.05
20 6 1.31
18 18 1.34
11 24 1.15
14 24 1.05

Hvis vi skulle køre følgende forespørgsel:

SELECT
	company_id,
	units,
	unit_cost
FROM
	index_test
WHERE
	company_id = 18

Databasen skulle søge gennem alle 17 rækker i den rækkefølge, de vises i tabellen, fra top til bund, én ad gangen. Så for at søge efter alle de potentielle forekomster af company_id nummer 18, skal databasen se gennem hele tabellen for alle optrædener af 18 i company_id kolonne.

Dette vil kun blive mere og mere tidskrævende, efterhånden som bordets størrelse øges. Efterhånden som dataenes sofistikerede stiger, er det, der i sidste ende kunne ske, at en tabel med en milliard rækker forbindes med en anden tabel med en milliard rækker; forespørgslen skal nu søge gennem det dobbelte antal rækker, der koster det dobbelte af tiden.

Du kan se, hvordan dette bliver problematisk i vores altid datamættede verden. Tabeller øges i størrelse og søgning øges i eksekveringstid.

At forespørge på en uindekseret tabel, hvis den præsenteres visuelt, ville se sådan ud:

Hvad indeksering gør, er at opsætte den kolonne, du er søgebetingelser på, i en sorteret rækkefølge for at hjælpe med at optimere forespørgselsydeevne.

Med et indeks på company_id kolonne, ville tabellen i det væsentlige "se" sådan her:

virksomheds-id enhed enhedspris
10 12 1.15
10 12 1.15
11 24 1.15
11 24 1.15
12 12 1.05
12 24 1.3
12 12 1.05
14 18 1.31
14 12 1,95
14 24 1.05
16 12 1.31
18 18 1.34
18 6 1.34
18 12 1.35
18 18 1.34
20 6 1.31
21 18 1.36

Nu kan databasen søge efter company_id nummer 18 og returner alle de anmodede kolonner for den række og gå derefter videre til næste række. Hvis den næste række er comapny_id nummeret er også 18, så returnerer det alle de kolonner, der er anmodet om i forespørgslen. Hvis den næste rækkes company_id er 20, ved forespørgslen at stoppe med at søge, og forespørgslen afsluttes.

Hvordan fungerer indeksering?

I virkeligheden omorganiserer databasetabellen ikke sig selv hver gang forespørgselsbetingelserne ændres for at optimere forespørgselsydeevnen:det ville være urealistisk. I virkeligheden er det, der sker, at indekset får databasen til at skabe en datastruktur. Datastrukturtypen er meget sandsynligt et B-træ. Mens fordelene ved B-Tree er talrige, er den største fordel for vores formål, at det er sorterbart. Når datastrukturen er sorteret i rækkefølge, gør det vores søgning mere effektiv af de åbenlyse årsager, som vi har nævnt ovenfor.

Når indekset opretter en datastruktur på en specifik kolonne, er det vigtigt at bemærke, at ingen anden kolonne er gemt i datastrukturen. Vores datastruktur for tabellen ovenfor vil kun indeholde company_id tal. Enheder og unit_cost vil ikke blive holdt i datastrukturen.

Hvordan ved databasen, hvilke andre felter i tabellen der skal returneres?

Databaseindekser vil også gemme pointere, som blot er referenceinformation for placeringen af ​​den yderligere information i hukommelsen. Grundlæggende indeholder indekset company_id og den pågældende rækkes hjemmeadresse på hukommelsesdisken. Indekset vil faktisk se sådan her ud:

virksomheds-id pointer
10 _123
10 _129
11 _127
11 _138
12 _124
12 _130
12 _135
14 _125
14 _131
14 _133
16 _128
18 _126
18 _131
18 _132
18 _137
20 _136
21 _134

Med det indeks kan forespørgslen kun søge efter rækkerne i company_id kolonne, der har 18 og derefter ved hjælp af markøren kan gå ind i tabellen for at finde den specifikke række, hvor markøren bor. Forespørgslen kan derefter gå ind i tabellen for at hente felterne for de kolonner, der er anmodet om for de rækker, der opfylder betingelserne.

Hvis søgningen blev præsenteret visuelt, ville den se sådan ud:

Recap

  • Indeksering tilføjer en datastruktur med kolonner til søgebetingelserne og en markør
  • Markøren er adressen på hukommelsesdisken i rækken med resten af ​​informationen
  • Indeksdatastrukturen er sorteret for at optimere forespørgselseffektiviteten
  • Forespørgslen leder efter den specifikke række i indekset; indekset henviser til den markør, som finder resten af ​​informationen.
  • Indekset reducerer antallet af rækker, som forespørgslen skal søge igennem, fra 17 til 4.

  1. Få resultater fra oracles lagrede procedure

  2. Sådan konfigureres SELinux til PostgreSQL og TimescaleDB

  3. En databasemodel til en onlineundersøgelse. Del 4

  4. Sammenligning af objekter efter værdi. Del 6:Struktur ligestillingsimplementering