Vra

Gegewe dat kruip is so belangrik as jou data stel in grootte toeneem, kan iemand verduidelik hoe kruip werk by'n databasis-agnostikus vlak?

Vir meer inligting oor navrae na die indeks'n veld, check Hoe doen ek indeks'n databasis kolom.

Was dit nuttig?

Oplossing

Hoekom is dit nodig?

Wanneer die data is gestoor op die skyf-gebaseerde stoor toestelle, is dit gestoor word as die blokke van data.Hierdie blokke is verkry in hul geheel, maak hulle die atoom skyf toegang tot die operasie.Skyf blokke is gestruktureer in veel dieselfde manier as'n geskakelde lyste;beide bevat'n afdeling vir data, 'n verwysing na die ligging van die volgende node (of blok), en beide moet nie gestoor word nie contiguously.

As gevolg van die feit dat'n aantal van die rekords kan net gesorteer word op een veld, kan ons sê dat die soek op'n veld wat nie gesorteer vereis'n Lineêre Soek wat vereis N/2 blok toegang (gemiddeld), waar N is die aantal van die blokke wat die tafel strek.As die veld is'n nie-sleutel veld (bv.nie bevat unieke inskrywings) dan is die hele tabelruimte moet gesoek word by N blok toegang.

Terwyl met'n gesorteer veld, 'n Binêre Soek gebruik kan word, wat log2 N blok toegang.Ook sedert die data word gesorteer gegee'n nie-sleutel veld, die res van die tafel nie nodig het om te word gesoek vir dubbele waardes, een keer'n hoër waarde is gevind.So het die prestasie verhoog is aansienlike.

Wat is kruip?

Kruip is'n manier van die sortering'n aantal rekords op verskeie velde.Die skep van'n indeks op'n veld in'n tabel skep'n data struktuur wat die besit van die veld waarde, en'n verwysing na die rekord dit verband hou met.Hierdie indeks struktuur word dan gesorteer, sodat Binêre Soek om te word uitgevoer op dit.

Die nadeel te kruip, is dat hierdie indekse addisionele spasie op die skyf sedert die indekse gestoor word saam in'n tabel met behulp van die MyISAM enjin, hierdie lêer kan vinnig bereik die grense van die grootte van die onderliggende lêer stelsel as baie velde binne dieselfde tafel is geïndekseer.

Hoe werk dit?

Eerstens, laat ons'n oorsig van'n monster databasis tabel skedule;

Field name       Data type      Size on disk
id (Primary key) Unsigned INT   4 bytes
firstName        Char(50)       50 bytes
lastName         Char(50)       50 bytes
emailAddress     Char(100)      100 bytes

Nota:kar is gebruik in die plek van varchar om voorsiening te maak vir'n akkurate grootte op die skyf waarde.Hierdie voorbeeld databasis bevat vyf miljoen rye en is unindexed.Die prestasie van verskeie navrae sal nou ontleed word.Hierdie is'n soektog met behulp van die id ('n gesorteer sleutel veld) en een met behulp van die voornaam ('n nie-sleutel ongeorden veld).

Voorbeeld 1 - gesorteer vs ongeorden velde

Gegewe ons voorbeeld databasis van r = 5,000,000 rekords van'n vaste grootte gee'n rekord lengte van R = 204 grepe en hulle gestoor word in'n tabel met behulp van die MyISAM enjin wat is die gebruik van die standaard blok grootte B = 1,024 grepe.Die blokkering van die faktor van die tafel sou wees bfr = (B/R) = 1024/204 = 5 rekords per skyf blok.Die totale aantal van die blokke wat nodig het om te hou die tafel is N = (r/bfr) = 5000000/5 = 1,000,000 blokke.

'n lineêre soek op die id veld sou vereis dat'n gemiddeld van N/2 = 500,000 blokkeer toegang om te vind'n waarde, gegewe dat die id veld is'n belangrike veld.Maar sedert die id veld is ook gesorteer, 'n binêre soek kan gedoen word wat'n gemiddeld van log2 1000000 = 19.93 = 20 blok toegang.Onmiddellik kan ons sien dit is'n drastiese verbetering.

Nou is die voornaam die veld is nie gesorteer nie'n sleutel veld, so'n binêre soek is onmoontlik, of is die waardes wat uniek is, en dus die tafel sal vereis op soek na die einde vir'n presiese N = 1,000,000 blok toegang.Dit is hierdie situasie wat kruip ten doel om reg te stel.

Gegee dat'n indeks rekord bevat slegs die geïndekseer veld en'n verwysing na die oorspronklike rekord, dit staan om te redeneer dat dit sal kleiner wees as die multi-veld rekord dat dit punte aan.So het die indeks self vereis minder skyf blokke as die oorspronklike tafel, wat vereis dus minder blok toegang te itereer deur.Die skedule vir'n indeks op die voornaam veld word hieronder uiteengesit;

Field name       Data type      Size on disk
firstName        Char(50)       50 bytes
(record pointer) Special        4 bytes

Nota:Wysers in MySQL is 2, 3, 4 of 5 grepe in lengte, afhangende van die grootte van die tabel.

Voorbeeld 2 - kruip

Gegewe ons voorbeeld databasis van r = 5,000,000 rekords met'n indeks rekord lengte van R = 54 grepe en die gebruik van die standaard blok grootte B = 1,024 grepe.Die blokkering van die faktor van die indeks sou wees bfr = (B/R) = 1024/54 = 18 rekords per skyf blok.Die totale aantal van die blokke wat nodig het om te hou die indeks is N = (r/bfr) = 5000000/18 = 277,778 blokke.

Nou'n soektog met behulp van die voornaam veld kan gebruik maak van die indeks te verhoog prestasie.Dit maak voorsiening vir'n binêre soek van die indeks met'n gemiddeld van log2 277778 = 18.08 = 19 blok toegang.Om die adres te vind van die werklike rekord, wat vereis dat'n verdere blok toegang te lees, dit bring die totaal tot 19 + 1 = 20 blok toegang, 'n far cry van die 1,000,000 blok toegang nodig is om'n te vind voornaam pas in die nie-geïndekseer tafel.

Wanneer moet dit gebruik word?

Gegewe dat die skep van'n indeks vereis bykomende spasie op die hardeskyf (277,778 ekstra blokke van die bogenoemde voorbeeld, 'n ~28% toename), en dat te veel indekse kan veroorsaak dat kwessies wat voortspruit uit die lêer stelsels grootte grense, versigtig gedink moet word wat gebruik word om te kies van die korrekte velde na die indeks.

Aangesien indekse is net gebruik word om te bespoedig die soek vir'n bypassende veld binne die rekords, dit staan om te redeneer dat kruip velde gebruik word slegs vir die uitvoer sou net'n vermorsing van spasie op die hardeskyf en verwerking van die tyd wanneer jy'n voeg of te verwyder operasie, en dus vermy moet word.Ook gegewe die aard van'n binêre soek, die cardinaliteit of uniekheid van die data is belangrik.Kruip op'n gebied met'n cardinaliteit van 2 sou verdeel die data in die helfte, terwyl'n cardinaliteit van 1.000 sou terugkeer ongeveer 1000 rekords.Met so'n lae cardinaliteit die doeltreffendheid verminder word tot'n lineêre soort, en die navraag optimizer sal verhoed dat die gebruik van die indeks as die cardinaliteit is minder as 30% van die rekord aantal, effektief te maak van die indeks'n vermorsing van ruimte.

Ander wenke

Die eerste keer dat ek dit lees was dit baie nuttig vir my. Baie dankie.

Sedertdien het ek opgedoen het 'n insig oor die negatiewe kant van die skep van indekse: As jy in 'n tabel (UPDATE of INSERT) skryf met een indeks, jy het eintlik twee skriftelik bedrywighede in die lêerstelsel. Een vir die tafel data en nog een vir die indeks data (en die wend daarvan (en - indien gegroepeer - die wend van die tafel data)). As tafel en indeks is geleë op dieselfde hardeskyf hierdie kos meer tyd. So 'n tafel sonder 'n indeks ( 'n hoop), sal toelaat vir vinniger skryf bedrywighede. (As jy het twee indekse jy sal eindig met drie skryf bedrywighede, en so aan)

Maar die definisie van twee verskillende plekke op twee verskillende hardeskywe vir indeks data en tafel data kan afneem / die probleem van verhoogde koste van tyd uit te skakel. Dit vereis definisie van bykomende lêer groepe met volgens lêers op die gewenste harde skywe en definisie van tafel / indeks plek as jy wil.

Nog 'n probleem met indekse is hul fragmentasie met verloop van tyd as data is ingevoeg. REORGANIZE help, moet jy roetines om dit gedoen te skryf.

In sekere scenario's 'n hoop is meer nuttig as 'n tafel met indekse,

Bv: -. As jy baie van die rivaliserende skryf maar net een nag te lees buite besigheidsure vir verslagdoening

Ook, 'n onderskeid tussen cluster en nie-gegroepeer indekse is eerder belangrik.

het my gehelp: - Wat doen Gegroepeer en Nie gegroepeer indeks eintlik bedoel?

'n indeks is net 'n data struktuur wat die soek vinniger maak vir 'n spesifieke kolom in 'n databasis. Hierdie struktuur is gewoonlik 'n b-boom of 'n hash tafel maar dit kan enige ander logika struktuur wees.

Classic voorbeeld "Index in Boeke"

Oorweeg 'n "Boek" van 1000 bladsye, gedeel deur 100 artikels, elke afdeling met X bladsye.

Eenvoudige, huh?

Nou, sonder 'n indeks bladsy, na 'n spesifieke artikel wat begin met die letter "S" te vind, jy het geen ander opsie as om die skandering deur die hele boek. d.w.z: 1000 bladsye

Maar met 'n indeks bladsy aan die begin, jy is daar. En nog baie meer, om 'n bepaalde afdeling wat saak lees, jy net nodig het om te kyk oor die indeks bladsy, weer en weer, elke keer. Na die vind van die komende indeks kan jy doeltreffend te spring om die artikel draai die ander afdelings.

Maar dan, in toevoeging tot 1000 bladsye, jy sal 'n ander nodig ~ 10 bladsye aan die indeks bladsy vertoon, so totaal 1010 bladsye.

So, die indeks is 'n aparte afdeling wat waardes van geïndekseerde kolom + wyser om die kruip ry in 'n gesorteerde volgorde vir doeltreffende look-ups stoor.

Dinge is eenvoudig in skole, is dit nie? : P

Nou, laat ons sê dat ons wil om te hardloop van'n navraag te vind al die besonderhede van enige werknemers wat is die naam van'abc'?

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

Wat sou gebeur sonder'n indeks?

Databasis-sagteware sou letterlik het om te kyk na elke enkele ry in die Werknemer tafel om te sien of die Employee_Name vir daardie ry is die'abc'.En, omdat ons wil hê dat elke ry met die naam " Abc "binnekant van dit, ons kan net nie ophou soek sodra ons vind net een ry met die naam" Abc, want daar kan ander rye met die naam Abc.So, elke ry tot op die laaste ry moet gesoek word – wat beteken dat duisende van die rye in hierdie scenario sal hê om ondersoek te word deur die databasis te vind die rye met die naam'abc'.Dit is wat genoem word'n volle tafel scan

Hoe om'n databasis indeks kan help prestasie

Die hele punt van'n indeks is om die bespoediging van navrae deur in wese sny af van die aantal rekords/rye in'n tabel wat ondersoek moet word.'n indeks is'n data struktuur (mees algemeen'n B - boom) wat winkels die waardes vir'n spesifieke kolom in'n tabel.

Hoe B-bome indeks werk?

Die rede B - bome is die mees gewilde data struktuur vir die indekse is te danke aan die feit dat hulle tyd-doeltreffende – want kyk-ups, weglatings, en invoegings kan gedoen word in logaritmiese tyd.En, nog'n groot rede B - bome is meer algemeen gebruik word, is omdat die data wat gestoor word binne-in die B - boom kan gesorteer word.Die RDBMS tipies bepaal watter data struktuur is eintlik gebruik word vir'n indeks.Maar, in'n paar scenario's met sekere RDBMS is, jy kan eintlik spesifiseer watter data struktuur wat jy wil hê dat jou databasis te gebruik wanneer jy die skep van die indeks self.

Hoe kan'n hash tafel indeks werk?

Die rede hash indekse gebruik word is omdat hash tafels is baie doeltreffend wanneer dit kom om net te kyk waardes.So, navrae wat vergelyk vir gelykheid aan'n string kan haal waardes baie vinnig as wat hulle gebruik om'n hash indeks.

Byvoorbeeld, die navraag wat ons vroeër bespreek kan voordeel trek uit'n hash indeks geskep op die Employee_Name kolom.Die manier waarop'n hash indeks sou werk, is dat die kolom waarde sal wees om die sleutel in die hash tafel en die werklike waarde koppel aan dat die sleutel sou net'n verwysing na die ry van die data in die tabel.Aangesien'n hash tafel is basies'n assosiatiewe skikking, 'n tipiese inskrywing sou lyk iets soos "Abc => 0x28939", waar 0x28939 is'n verwysing na die tafel ry waar Abc is gestoor in die geheue.Op soek na'n waarde soos "Abc" in'n hash tafel indeks en om weer'n verwysing na die ry in die geheue is natuurlik'n baie vinniger as die skandering van die tafel om uit te vind al die rye met'n waarde van "Abc" in die Employee_Name kolom.

Die nadele van'n hash indeks

Hash tafels is nie gesorteer data strukture, en daar is baie verskillende tipes van navrae wat hash indekse kan nie eens help met.Byvoorbeeld, veronderstel jy wil om uit te vind al die werknemers wat minder as 40 jaar oud.Hoe kan jy dit doen met'n hash tafel indeks?Wel, dit is nie moontlik nie omdat'n hash tafel is net goed vir die soek sleutel-waarde pare – wat beteken navrae het dat die tjek vir gelykheid

Wat presies is binne-in'n databasis indeks? So, nou weet jy dat'n indeks databasis is geskep op'n kolom in'n tabel, en dat die indeks winkels die waardes in daardie spesifieke kolom.Maar, dit is belangrik om te verstaan dat'n databasis indeks nie die stoor van die waardes in die ander kolomme van dieselfde tafel.Byvoorbeeld, as ons skep'n indeks op die Employee_Name kolom, dit beteken dat die Employee_Age en Employee_Address kolom waardes is ook nie gestoor word in die indeks.As ons het net die winkel al die ander kolomme in die indeks, dan is dit sou wees, net soos die skep van nog'n kopie van die hele tafel – wat sou neem te veel ruimte en sou baie ondoeltreffend.

Hoe kan'n databasis weet wanneer om te gebruik'n indeks? Wanneer'n navraag soos "SELECT * FROM Werknemer WAAR Employee_Name = 'abc'" is hardloop, die databasis sal kyk om te sien of daar is'n indeks op die kolom(s) bevraagteken.Die aanvaarding van die Employee_Name kolom het'n indeks geskep op dit, die databasis sal hê om te besluit of dit werklik sin maak om te gebruik die indeks om te vind die waardes wat deursoek – want daar is'n paar scenario's waar dit is eintlik minder doeltreffend te gebruik om die databasis indeks, en meer doeltreffende net om te scan die hele tafel.

Wat is die koste van'n databasis indeks?

Dit neem ruimte – en die groter jou tafel, die groter jou indeks.Nog'n prestasie getref met indekse is die feit dat wanneer jy voeg, te verwyder, of werk rye in die ooreenstemmende tafel, dieselfde bedrywighede sal gedoen moet word om jou indeks.Onthou dat'n indeks behoeftes te bevat dieselfde tot op die minuut data as wat in die tabel kolom(s) wat die indeks dek.

As'n algemene reël, 'n indeks moet net geskep word op'n tafel as die data in die geïndekseer kolom sal bevraagteken word gereeld.

Sien ook

  1. Wat kolomme oor die algemeen maak goeie indekse?
  2. Hoe doen databasis indekse werk

Eenvoudige Beskrywing!!!!!!!!!!

Die indeks is niks, maar'n data struktuur wat winkels die waardes vir'n spesifieke kolom in'n tabel.'n indeks is geskep op'n kolom van'n tafel.

Byvoorbeeld, ons het'n databasis tabel genoem Gebruiker met drie kolomme – Naam, Ouderdom, en Adres.Aanvaar dat die Gebruiker tafel het duisende van die rye.

Nou, laat ons sê dat ons wil om te hardloop van'n navraag te vind al die besonderhede van enige gebruikers wat is die naam "Johannes'.As ons die volgende navraag.

SELECT * FROM User 
WHERE Name = 'John'

Die databasis sagteware sou letterlik het om te kyk na elke enkele ry in die Gebruiker tafel om te sien as die Naam vir daardie ry is "John'.Dit sal'n lang tyd neem.
Dit is waar indeks help ons "- indeks is gebruik om die spoed van navrae deur in wese sny af van die aantal rekords/rye in'n tabel wat nodig het om ondersoek te word".
Hoe om te skep'n indeks

CREATE INDEX name_index
ON User (Name)

'n indeks bestaan uit kolom waardes(Bv.:John) van die een tafel, en dat die waardes gestoor word in'n data struktuur.
So nou is die databasis sal gebruik om die indeks te vind werknemers met die naam John omdat die indeks sal vermoedelik gesorteer word alfabeties deur die Gebruikers naam.En, omdat dit gesorteer is, beteken dit dat die soek vir'n naam is'n baie vinniger, want al die name wat begin met'n "J" sal wees reg langs mekaar in die indeks!

Net 'n vinnige voorstel .. As kruip koste jy addisionele skryf en stoorplek, so as jou aansoek meer insetsel / update werking vereis, wil jy dalk om tabelle te gebruik sonder indekse, maar as dit vereis meer data herwinning bedrywighede, jy moet gaan vir geïndekseer tafel.

Dink net databasis-indeks as indeks van 'n boek.  As jy 'n boek oor honde en jy wil 'n inligtingsessie oor kom ons sê, Duitse herdershonde te vind, jy kan natuurlik flip deur al die bladsye van die boek en kry wat jy is op soek na, maar dit is natuurlik tydrowend en nie baie vinnig. Nog 'n opsie is dat jy net kan gaan na die indeks gedeelte van die boek en dan vind wat jy op soek is na deur die gebruik van die Naam van die entiteit jy op soek is (in hierdie geval, Duitse herdershonde) en ook te kyk na die bladsy nommer vinnig te vind wat jy soek vir. In databasis, is die bladsynommer verwys as 'n wyser wat die databasis gelas om die adres op die skyf waar entiteit is geleë. Met behulp van dieselfde Duitse Herder analogie, kan ons so iets ( "Duitse Herder", 0x77129) waar 0x77129 is die adres op die skyf waar die ry data vir Duitse Herder gestoor het.

In kort, 'n indeks is 'n datastruktuur wat die waardes stoor vir 'n spesifieke kolom in 'n tabel om sodoende bespoedig navraag soek.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top