Hey Habr! Ech presentéieren Iech d'Iwwersetzung vum Artikel
.
Wann et Ă«m relational Datenbanken kĂ«nnt, kann ech net hĂ«llefen, datt eppes fehlt. Si ginn iwwerall benotzt. Et gi vill verschidden Datenbanken verfĂŒgbar, vun der klenger an nĂ«tzlecher SQLite bis zu de mĂ€chtege Teradata. Awer et ginn nĂ«mmen e puer Artikelen dĂ©i erklĂ€re wĂ©i d'Datebank funktionnĂ©iert. Dir kĂ«nnt fir Iech selwer sichen mat "howdoesarelationaldatabasework" fir ze kucken wĂ©i wĂ©ineg Resultater et ginn. Ausserdeem sinn dĂ«s Artikele kuerz. Wann Dir no de leschte buzzy Technologien sicht (BigData, NoSQL oder JavaScript), fannt Dir mĂ©i detaillĂ©iert Artikelen dĂ©i erklĂ€re wĂ©i se funktionnĂ©ieren.
Sinn relational Datenbanken ze al an ze langweileg fir ausserhalb vun den Universitéitscoursen, Fuerschungsaarbechten a Bicher z'erklÀren?

Als Entwéckler haassen ech eppes ze benotzen wat ech net verstinn. A wann Datenbanken fir méi wéi 40 Joer benotzt ginn, muss et e Grond sinn. Iwwer d'Joren hunn ech Honnerte vu Stonnen verbruecht fir dës komesch schwaarz Këschte wierklech ze verstoen déi ech all Dag benotzen. Relational Datenbanken ganz interessant well se baséiert op nëtzlech a reusable Konzepter. Wann Dir interesséiert sidd fir eng Datebank ze verstoen, awer nach ni ZÀit oder Neigung hat fir dëst breet Thema ze verdéiwen, sollt Dir dësen Artikel genéissen.
Och wann den Titel vun dësem Artikel explizit ass, Den Zweck vun dësem Artikel ass net ze verstoen wéi d'Datebank benotzt. Dofir, Dir sollt scho wësse wéi Dir eng einfach Verbindungsufro a Basisufroen schreift RAW; soss kënnt Dir dësen Artikel net verstoen. Dat ass dat eenzegt wat Dir wësse musst, ech erklÀren de Rescht.
Ech fÀnken un mat e puer Informatik Basis, wéi ZÀit Komplexitéit vun Algorithmen (BigO). Ech weess, datt e puer vun iech dëst Konzept haassen, awer ouni et wÀert Dir d'Intricacies an der Datebank net verstoen. Well dëst e grousst Thema ass, Ech konzentréieren op wat ech mengen ass wichteg: wéi d'Datebank veraarbecht SQL Ufro. Ech stellen Iech just vir Basis Datebank Konzeptersou datt Dir um Enn vum Artikel eng Iddi hutt wat ënner der Hood lass ass.
Well dĂ«st e laangen an techneschen Artikel ass, dee vill Algorithmen an Datestrukturen involvĂ©iert, huelt Ăr ZĂ€it fir duerch et ze liesen. E puer Konzepter kĂ«nne schwĂ©ier ze verstoen sinn; Dir kĂ«nnt se iwwersprangen an Ă«mmer nach dĂ©i allgemeng Iddi krĂ©ien.
Fir déi méi Wëssen ënner Iech, ass dësen Artikel an 3 Deeler opgedeelt:
- Iwwersiicht vun niddereg-Niveau an héich-Niveau Datebank Komponente
- Iwwersiicht vum Query Optimization Prozess
- Iwwersiicht vun Transaktioun an Buffer Pool Management
Zréck op d'Grondlage
Virun Joeren (an enger Galaxis wÀit, wÀit ewech...), hunn d'Entwéckler genee missen d'Zuel vun den Operatiounen wëssen, déi se codéieren. Si woussten hir Algorithmen an Datenstrukturen aus HÀerz well se sech net leeschte konnten d'CPU an d'Erënnerung vun hire luesen Computeren ze verschwenden.
An dësem Deel erënneren ech Iech un e puer vun dëse Konzepter well se wesentlech sinn fir d'Datebank ze verstoen. Ech wÀert och d'Konzept virstellen Datebank Index.
O(1) vs O(n2)
Hautdesdaags këmmeren sech vill Entwéckler net ëm d'ZÀitkomplexitéit vun den Algorithmen ... a si hu richteg!
Awer wann Dir mat vill Daten ze dinn hutt (ech schwÀtze net Dausende) oder wann Dir a Millisekonnen kÀmpft, gëtt et kritesch dëst Konzept ze verstoen. A wéi Dir Iech kënnt virstellen, mussen Datenbanken mat béide Situatiounen ëmgoen! Ech wÀert Iech net méi ZÀit verbréngen wéi néideg fir de Punkt duerchzeféieren. Dëst hëlleft eis d'Konzept vun der KÀschte-baséierter Optimiséierung spéider ze verstoen (kascht baséiert akeef).
Konzept
ZÀit Komplexitéit vum Algorithmus benotzt fir ze kucken wéi laang en Algorithmus dauert fir eng bestëmmte Quantitéit un Daten ze kompletéieren. Fir dës Komplexitéit ze beschreiwen, benotze mir grouss O mathematesch Notatioun. Dës Notatioun gëtt mat enger Funktioun benotzt déi beschreift wéivill Operatiounen en Algorithmus fir eng bestëmmten Unzuel vun Input brauch.
Zum Beispill, wann ech soen "dësen Algorithmus huet Komplexitéit O (some_function ())", heescht et, datt den Algorithmus Some_function (a_certain_amount_of_data) Operatiounen erfuerdert fir eng gewësse Quantitéit un Daten ze veraarbecht.
Sou Et ass net d'Quantitéit un Daten déi wichteg ass **, soss ** wéi d'Zuel vun den Operatiounen eropgeet mat der Erhéijung vum Datevolumen. ZÀitkomplexitéit bitt keng exakt Zuel vun Operatiounen, awer ass e gudde Wee fir d'AusféierungszÀit ze schÀtzen.

An dëser Grafik kënnt Dir d'Zuel vun den Operatiounen versus de Betrag vun Inputdaten fir verschidden Aarte vun Algorithmus ZÀitkomplexitéiten gesinn. Ech hunn eng logarithmesch Skala benotzt fir se ze weisen. An anere Wierder, d'Quantitéit un Daten klëmmt séier vun 1 op 1 Milliard, mir gesinn dat:
- O (1) oder konstant Komplexitéit bleift konstant (soss géif et net konstant Komplexitéit genannt ginn).
- O(aloggen(n)) bleift niddereg och mat Milliarden vun Daten.
- Schlëmmst Schwieregkeet - O(n2), wou d'Zuel vun den Operatiounen séier wiisst.
- Déi aner zwou Komplikatioune vergréisseren grad esou séier.
Beispiller
Mat enger klenger QuantitĂ©it un Daten ass den Ănnerscheed tĂ«scht O(1) an O(n2) vernolĂ©isseg. Zum Beispill, loosst eis soen datt Dir en Algorithmus hutt deen 2000 Elementer veraarbecht muss.
- Den O(1) Algorithmus kascht Iech 1 Operatioun
- Den O(log(n)) Algorithmus kascht Iech 7 Operatiounen
- Den O (n) Algorithmus kascht Iech 2 Operatiounen
- Den O(n*log(n)) Algorithmus kascht Iech 14 Operatiounen
- Den O(n2) Algorithmus kascht Iech 4 Operatiounen
Den Ănnerscheed tĂ«scht O(1) an O(n2) schĂ©ngt grouss (4 Millioune Operatiounen) awer Dir verlĂ©iert maximal 2 ms, just ZĂ€it fir Ăert Aen ze blĂ©nken. TatsĂ€chlech kĂ«nne modern Prozessoren veraarbecht ginn . Dofir sinn d'Performance an d'OptimisĂ©ierung net en Thema a villen IT Projeten.
Wéi gesot, et ass ëmmer nach wichteg dëst Konzept ze kennen wann Dir mat enorme Quantitéiten un Daten schafft. Wann dës Kéier den Algorithmus 1 Elementer muss veraarbecht (wat net sou vill fir eng Datebank ass):
- Den O(1) Algorithmus kascht Iech 1 Operatioun
- Den O(log(n)) Algorithmus kascht Iech 14 Operatiounen
- Den O (n) Algorithmus kascht Iech 1 Operatiounen
- Den O(n*log(n)) Algorithmus kascht Iech 14 Operatiounen
- Den O(n2) Algorithmus kascht Iech 1 Operatiounen
Ech hunn d'Mathematik net gemaach, awer ech géif soen datt Dir mam O(n2) Algorithmus ZÀit hutt fir e Kaffi ze drénken (och zwee!). Wann Dir en aneren 0 zum Datevolumen bÀidréit, hutt Dir ZÀit fir eng Schlof ze huelen.
Loosst eis méi déif goen
Fir ze referenzéieren:
- Eng gutt Hash-Tabelle Lookup fënnt en Element am O (1).
- Sich no engem gutt ausgeglachene Bam produzéiert Resultater am O(log(n)).
- Sich no engem Array produzéiert Resultater am O(n).
- Déi bescht Sortéierungsalgorithmen hunn Komplexitéit O(n*log(n)).
- E schlechte Sortimentalgorithmus huet Komplexitéit O (n2).
Notiz: An de folgenden Deeler wÀerte mir dës Algorithmen an Datestrukturen gesinn.
Et gi verschidden Aarte vun Algorithmus ZÀit Komplexitéit:
- Moyenne Fall Szenario
- beschte Fall Szenario
- an am schlëmmste Fall Szenario
ZÀit Komplexitéit ass dacks de schlëmmste Fall Szenario.
Ech hunn nëmmen iwwer d'ZÀitkomplexitéit vum Algorithmus geschwat, awer d'Komplexitéit gëllt och fir:
- Erënnerung Konsum vun der Algorithmus
- Scheif ech / O Konsum Algorithmus
Natierlech ginn et Komplikatioune méi schlëmm wéi n2, zum Beispill:
- n4: dat ass schrecklech! E puer vun den ernimmten Algorithmen hunn dës Komplexitéit.
- 3n: dat ass nach méi schlëmm! Ee vun den Algorithmen, déi mir an der Mëtt vun dësem Artikel gesinn, huet dës Komplexitéit (an et gëtt tatsÀchlech a ville Datenbanken benotzt).
- factorial n: Dir wĂ€ert ni Ăr Resultater krĂ©ien och mat enger klenger QuantitĂ©it vun DonnĂ©eĂ«n.
- nn: Wann Dir dĂ«s KomplexitĂ©it begĂ©int, sollt Dir Iech froen ob dat wierklech Ăren AktivitĂ©itsfeld ass ...
Notiz: Ech hunn Iech net déi tatsÀchlech Definitioun vun der grousser O Bezeechnung ginn, just eng Iddi. Dir kënnt dësen Artikel liesen op fir déi richteg (asymptotesch) Definitioun.
MergeSort
Wat maacht Dir wann Dir eng Sammlung sortĂ©iere musst? Waat? Dir rufft der Zort () Funktioun ... Ok, gutt Ăntwert ... MĂ€ fir eng Datebank, Dir musst verstoen wĂ©i dĂ«s Zort () Funktioun Wierker.
Et gi verschidde gutt Sortéierungsalgorithmen, also konzentréieren ech mech op déi wichtegst: fusionéieren Zort. Dir verstitt vlÀicht net firwat d'Sortéierungsdaten elo nëtzlech sinn, awer Dir sollt nom Ufrooptimiséierungsdeel. Ausserdeem, d'VerstÀndnis vun der Fusiounssort hëlleft eis spéider déi gemeinsam Datebankverbindungsoperatioun ze verstoen fusionéieren anzeschreiwen (Fusiounsverband).
Fusioun
Wéi vill nëtzlech Algorithmen hÀnkt d'Fusiounssort op engem Trick: d'Kombinatioun vun 2 zortéierten Arrays vu Gréisst N / 2 an en N-Element zortéiert Array kascht nëmmen N Operatiounen. Dës Operatioun gëtt Fusioun genannt.
Loosst eis kucken wat dëst mat engem einfache Beispill bedeit:

Dës Figur weist datt fir déi lescht zortéiert 8-Element-Array ze bauen, musst Dir nëmmen eemol iwwer déi 2 4-Element-Arrays iteréieren. Well béid 4-Element Arrays scho sortéiert sinn:
- 1) Dir verglÀicht béid aktuell Elementer an zwee Arrays (am Ufank aktuell = éischt)
- 2) huelt dann dee klengste fir se an eng 8 Elementarray ze setzen
- 3) a gitt op dat nÀchst Element an der Array wou Dir dat klengst Element geholl hutt
- a widderhuelen 1,2,3 bis Dir de leschten Element vun engem vun den Arrays erreecht.
- Dann huelt Dir déi verbleiwen Elementer vun der anerer Array fir se an eng 8 Element Array ze setzen.
Dëst funktionnéiert well béid 4-Element Arrays zortéiert sinn an dofir musst Dir net "zréckgoen" an dësen Arrays.
Elo wou mir den Trick verstinn, hei ass mÀi Pseudocode fir Fusioun:
array mergeSort(array a)
if(length(a)==1)
return a[0];
end if
//recursive calls
[left_array right_array] := split_into_2_equally_sized_arrays(a);
array new_left_array := mergeSort(left_array);
array new_right_array := mergeSort(right_array);
//merging the 2 small ordered arrays into a big one
array result := merge(new_left_array,new_right_array);
return result;Merge Sort brécht e Problem a méi kleng Probleemer an fënnt dann d'Resultater vun de méi klenge Probleemer fir d'Resultat vum urspréngleche Problem ze kréien (Notiz: dës Zort Algorithmus gëtt Divisioun an Erober genannt). Wann Dir dësen Algorithmus net versteet, maach der keng Suergen; Ech hunn et net verstanen déi éischte Kéier ech et gesinn hunn. Wann et Iech hëllefe kann, gesinn ech dësen Algorithmus als zwee-Phase Algorithmus:
- Divisiounsphase, wou d'Array a méi kleng Arrays opgedeelt ass
- D'Sortéierungsphase ass wou kleng Arrays kombinéiert ginn (mat der Unioun) fir eng méi grouss Array ze bilden.
Divisioun Phase

An der Divisiounsstadium gëtt d'Array an Eenheetsarrays an 3 Schrëtt opgedeelt. Déi formell Zuel vu Schrëtt ass Log (N) (zënter N = 8, Log (N) = 3).
Wéi weess ech dat?
Ech sinn genial! An engem Wuert - Mathematik. D'Iddi ass datt all Schrëtt d'Gréisst vun der ursprénglecher Array duerch 2 deelt. D'Zuel vun de Schrëtt ass d'Zuel vun de Mol, déi Dir d'Original Array an zwee deelt. Dëst ass déi exakt Definitioun vun engem Logarithmus (Basis 2).
Sortéierungsphase

An der Sortéierungsphase fÀnkt Dir mat Eenheeten (Eenzelelement) Arrays un. WÀrend all Schrëtt applizéiert Dir verschidde Fusiounsoperatiounen an d'GesamtkÀschte sinn N = 8 Operatiounen:
- An der éischter Etapp hutt Dir 4 Fusioune déi all 2 Operatiounen kaschten
- Am zweete Schrëtt hutt Dir 2 Fusioune déi all 4 Operatiounen kaschten
- Am drëtte Schrëtt hutt Dir 1 Fusioun déi 8 Operatiounen kascht
Well et Log (N) Schrëtt sinn, Gesamtkosten N * log(N) Operatiounen.
Virdeeler vun fusionéieren Zort
Firwat ass dësen Algorithmus sou staark?
Well:
- Dir kënnt et Ànneren fir de Memory Footprint ze reduzéieren sou datt Dir keng nei Arrays erstellt, awer direkt den Input Array Ànnert.
Notiz: Dës Zort Algorithmus gëtt genannt (Sortéieren ouni zousÀtzlech Erënnerung).
- Dir kënnt et Ànneren fir Disk Space an eng kleng Quantitéit un Erënnerung zur selwechter ZÀit ze benotzen ouni bedeitend Disk I / O Overhead ze maachen. D'Iddi ass nëmmen déi Deeler an d'Erënnerung ze lueden, déi am Moment veraarbecht ginn. Dëst ass wichteg wann Dir e Multi-Gigabyte Dësch mat nëmmen engem 100-Megabyte Memory Buffer sortéiere musst.
Notiz: Dës Zort Algorithmus gëtt genannt .
- Dir kënnt et Ànneren fir op verschidde Prozesser / Threads / Serveren ze lafen.
Zum Beispill, verdeelt Fusiounssort ass ee vun de Schlësselkomponenten (wat eng Struktur a Big Data ass).
- Dësen Algorithmus kann Blei a Gold ëmsetzen (wierklech!).
Dëse Sortéierungsalgorithmus gëtt an de meeschten (wann net all) Datenbanken benotzt, awer et ass net deen eenzegen. Wann Dir méi wësse wëllt, kënnt Dir dëst liesen , déi d'Virdeeler an Nodeeler vun gemeinsamen Datebanksortéierungsalgorithmen diskutéiert.
Array, Bam an Hash Dësch
Elo wou mir d'Iddi vun der ZÀitkomplexitéit an der Sortéierung verstinn, sollt ech Iech iwwer 3 Datestrukturen soen. Dëst ass wichteg well se sinn d'Basis vun modernen Datenbanken. Ech wÀert och d'Konzept virstellen Datebank Index.
Array
Eng zweedimensional Array ass déi einfachst Datestruktur. En Dësch kann als Array geduecht ginn. Zum Beispill:

Dës 2-zweedimensional Array ass eng Tabell mat Reihen a Kolonnen:
- All Linn stellt eng Entitéit duer
- Kolonnen spÀicheren Eegeschaften déi d'Entitéit beschreiwen.
- All Kolonn spÀichert Daten vun engem spezifeschen Typ (ganz Zuel, String, Datum ...).
Dëst ass bequem fir Daten ze spÀicheren an ze visualiséieren, awer wann Dir e spezifesche WÀert muss fannen, ass dëst net gëeegent.
Zum Beispill, wann Dir wëllt all KÀrelen ze fannen, déi an de UK schaffen, Dir musst op all Zeil kucken fir ze bestëmmen ob dës Zeil zum UK gehéiert. Et kascht Iech N Transaktiounenwou N - Zuel vun de Linnen, wat net schlecht ass, awer kéint et e méi séier Wee ginn? Elo ass et ZÀit fir eis mat de Beem kennenzeléieren.
Notiz: Déi meescht modern Datenbanken bidden erweidert Arrays fir Tabellen effizient ze spÀicheren: Heap-organiséiert Dëscher an Index-organiséiert Dëscher. Awer dëst Ànnert net de Problem fir séier e spezifeschen Zoustand an enger Grupp vu Sailen ze fannen.
Datebank Bam an Index
E binÀre Sichbaum ass e binÀre Bam mat enger spezieller Eegeschafte, de Schlëssel bei all Node muss sinn:
- méi grouss wéi all d'Schlësselen, déi am lénksen Subtree gespÀichert sinn
- manner wéi all Schlësselen am richtege Subtree gespÀichert
Loosst eis kucken wat dat visuell bedeit
Idea

Dëse Bam huet N = 15 Elementer. Loosst eis soen, ech sichen no 208:
- Ech fÀnke bei der Wuerzel un, deem sÀi Schlëssel 136 ass. Zënter 136<208 kucken ech op de richtege Subtree vum Node 136.
- 398>208 dofir kucken ech de lĂ©nksen Ănnerbaum vum Node 398
- 250>208 dofir kucken ech de lĂ©nksen Ănnerbaum vum Node 250
- 200<208, dofir kucken ech de richtege Subtree vum Node 200. Awer 200 huet kee richtege Subtree, WÀert existéiert net (well wann et existéiert, wÀert et am richtege Subtree 200 sinn).
Loosst eis elo soen, ech sichen no 40
- Ech fĂ€nken un der Wuerzel, deem sĂ€i SchlĂ«ssel 136 ass. ZĂ«nter 136 > 40 kucken ech op de lĂ©nksen Ănnerbaum vum Node 136.
- 80 > 40, dofir kucken ech de lĂ©nksen Ănnerbaum vum Node 80
- 40 = 40, Node existéiert. Ech recuperéieren der Rei ID am Node (net am Bild gewisen) a kucken an der Tabell fir déi uginn Rei ID.
- Wësse vun der Rei ID erlaabt mir genee ze wëssen wou d'Donnéeën an der Tabell sinn, sou datt ech se direkt zréckzéien.
Um Enn wÀerte béid Recherchen mech d'Zuel vun den Niveauen am Bam kaschten. Wann Dir den Deel iwwer fusionéieren Zort virsiichteg liesen, Dir sollt gesinn, datt et Log (N) Niveauen sinn. Et stellt sech eraus, Sich KÀschten Log (N), net schlecht!
Komme mer zréck op eise Problem
Awer dëst ass ganz abstrakt, also loosst eis zréck op eise Problem kommen. Amplaz vun engem einfachen Ganzt, stellt Iech eng String vir, déi d'Land vun engem an der viregter Tabell duerstellt. Loosst eis soen datt Dir e Bam hutt deen d'"Land" Feld (Kolonn 3) vun der Tabell enthÀlt:
- Wann Dir wëllt wëssen, wien an de UK schafft
- Dir kuckt op de Bam fir den Node ze kréien deen Groussbritannien duerstellt
- bannen "UKnode" fannt Dir de Standuert vun UK Aarbechter records.
Dës Sich kascht Log (N) Operatiounen amplaz N Operatiounen wann Dir d'Array direkt benotzt. Wat Dir just presentéiert war Datebank Index.
Dir kënnt en Indexbaum fir all Grupp vu Felder bauen (String, Zuel, 2 Zeilen, Zuel a String, Datum ...) soulaang Dir eng Funktioun hutt fir Schlësselen ze verglÀichen (dh Feldgruppen), fir datt Dir astellen kënnt Uerdnung ënnert de Schlësselen (wat de Fall ass fir all Basistypen an der Datebank).
B + TreeIndex
Och wann dëse Bam gutt funktionnéiert fir e spezifesche WÀert ze kréien, gëtt et e BIG Problem wann Dir braucht kréien verschidde Elementer tëscht zwee WÀerter. Dëst wÀert O(N) kaschten, well Dir musst all Node am Bam kucken a kucken ob et tëscht dësen zwee WÀerter ass (zB mat enger bestallter Traversal vum Bam). Ausserdeem ass dës Operatioun net Disk I/O frëndlech, well Dir musst de ganze Bam liesen. Mir mussen e Wee fannen fir effizient auszeféieren Gamme Ufro. Fir dëse Problem ze léisen, benotzen modern Datenbanken eng modifizéiert Versioun vum fréiere Bam genannt B + Tree. An engem B + Bam Bam:
- nëmmen déi ënnescht Noden (Blieder) Buttek Informatiounen (Plaz vun de Reihen an der verwandter Tabell)
- de Rescht vun de Wirbelen sinn hei fir Routing zum richtegen Node wÀhrend der Sich.

WĂ©i Dir gesitt, ginn et mĂ©i Wirbelen hei (zweemol). TatsĂ€chlech hutt Dir zousĂ€tzlech Wirbelen, "DecisiounsknĂ€ppchen", dĂ©i Iech hĂ«llefen dee richtegen Node ze fannen (deen d'Plaz vun de Reihen an der assoziĂ©ierter Tabell spĂ€ichert). Awer d'SichkomplexitĂ©it ass Ă«mmer nach O(log(N)) (et gĂ«tt nĂ«mmen een Niveau mĂ©i). De groussen Ănnerscheed ass dat Noden um Ă«nneschten Niveau si mat hiren Nofolger verbonnen.
Mat dësem B + Bam, wann Dir no WÀerter tëscht 40 an 100 sicht:
- Dir musst just no 40 sichen (oder den nootste WÀert no 40 wann 40 net existéiert) wéi Dir mam fréiere Bam gemaach hutt.
- Da sammelt 40 Ierwen mat direkten Ierwe Links bis Dir 100 erreecht.
Loosst eis soen, Dir fannt M Nofolger an de Bam huet N Wirbelen. Fannt e spezifesche Node kascht Log (N) wĂ©i de frĂ©iere Bam. Awer eemol Dir dĂ«sen Node kritt, kritt Dir M Nofolger a M Operatiounen mat Referenzen op hir Nofolger. DĂ«s Sich kascht nĂ«mmen M+log(N) Operatiounen am Verglach zu N Operatiounen op der viregter Bam. Ausserdeem musst Dir net de ganze Bam liesen (nĂ«mmen M+log(N) Noden), dat heescht manner Diskverbrauch. Wann M kleng ass (zB 200 Zeile) an N grouss ass (1 Zeile), da gĂ«tt et e BIG Ănnerscheed.
Mee et ginn nei Problemer hei (erëm!). Wann Dir eng Zeil an der Datebank addéiert oder lÀscht (an dofir am verbonne B+Tree Index):
- Dir musst Uerdnung tëscht den Wirbelen an engem B + Bam behalen, soss kënnt Dir d'Knuet net an engem ongesortéierte Bam fannen.
- Dir musst déi minimal méiglech Unzuel vun Niveauen am B + Tree halen, soss gëtt d'O(log(N)) ZÀitkomplexitéit O(N).
An anere Wierder, B + Tree muss selwer bestallt a equilibréiert sinn. Glécklecherweis ass dëst méiglech mat Smart LÀschen an Insert Operatiounen. Awer dëst kënnt op KÀschten: Insertiounen an LÀschen an engem B+ Bam kaschten O(log(N)). Dofir hunn e puer vun iech dat héieren zevill Indexen benotzen ass keng gutt Iddi. Wierklech, Dir verlangsamt séier Insert / Update / LÀschen vun enger Zeil an enger Tabellwell d'Datebank muss den Index vun der Tabell aktualiséieren mat enger deierer O(log(N)) Operatioun fir all Index. Ausserdeem bedeit d'Additioun vun Indexen méi Aarbechtsbelaaschtung fir Transaktioun Manager (gëtt um Enn vum Artikel beschriwwe ginn).
Fir méi Detailer, kënnt Dir de Wikipedia Artikel op . Wann Dir e Beispill wëllt fir B + Tree an enger Datebank ëmzesetzen, kuckt weg О vun engem féierende MySQL Entwéckler. Si fokusséieren allebéid op wéi InnoDB (de MySQL-Motor) Indexen handhabt.
Bemierkung: E ââLieser huet mir gesot datt wĂ©inst nidderegen Niveau Optimisatiounen de B + Bam komplett ausgeglach sollt sinn.
Hastable
Eis lescht wichteg Datestruktur ass den Hash-Tabelle. Dëst ass ganz nëtzlech wann Dir séier WÀerter wëllt sichen. Ausserdeem, d'Verstoe vun engem Hash-Tabel hëlleft eis spéider eng gemeinsam Datebank-Joint-Operatioun ze verstoen, genannt Hash Join ( hash matmaachen). Dës Datestruktur gëtt och vun der Datebank benotzt fir e puer intern Saachen ze spÀicheren (z. SpÀr Dësch oder Puffer Pool, mir wÀerte béid vun dëse Konzepter spéider gesinn).
En Hash-Tabelle ass eng Datestruktur déi séier en Element duerch sÀi Schlëssel fënnt. Fir en Hash Dësch ze bauen musst Dir definéieren:
- Hiweis fir Ăr Elementer
- hash Funktioun fir Schlësselen. Déi berechnen Schlësselhashen ginn d'Plaz vun den Elementer (genannt Segmenter ).
- Funktioun fir Schlësselen ze verglÀichen. Wann Dir de richtege Segment fonnt hutt, musst Dir dat Element fannen deen Dir am Segment sicht mat dësem Verglach.
Einfach Beispill
Loosst eis e kloert Beispill huelen:

Dësen Hash Dësch huet 10 Segmenter. Well ech faul sinn, hunn ech nëmmen 5 Segmenter opgestallt, awer ech weess datt Dir schlau sidd, also loossen ech Iech déi aner 5 eleng Foto. Ech hunn eng Hashfunktioun modulo 10 vum Schlëssel benotzt. An anere Wierder, ech spÀicheren nëmmen déi lescht Ziffer vum Schlëssel vum Element fir sÀi Segment ze fannen:
- wann déi lescht Ziffer 0 ass, fÀllt d'Element an de Segment 0,
- wann déi lescht Ziffer 1 ass, fÀllt d'Element an de Segment 1,
- wann déi lescht Ziffer 2 ass, fÀllt d'Element an Gebitt 2,
- ...
D'VerglÀichsfunktioun déi ech benotzt hunn ass einfach GlÀichheet tëscht zwee ganz Zuelen.
Loosst eis soen datt Dir Element 78 wëllt kréien:
- Den Hash-Tabelle berechent den Hashcode fir 78, dat ass 8.
- Den Hash-Tabelle kuckt op Segment 8, an dat éischt Element dat et fënnt ass 78.
- Si gëtt Element 78 fir Iech zréck
- Sich kascht nëmmen 2 Operatiounen (eent fir den HashwÀert ze berechnen an deen aneren fir d'Element am Segment ze kucken).
Loosst eis elo soen datt Dir Element 59 wëllt kréien:
- Den Hash-Tabelle berechent den Hashcode fir 59, dat ass 9.
- Den Hash-Tabelle sicht am Segment 9, dat éischt Element dat fonnt gëtt ass 99. Zënter 99!=59 ass Element 99 kee valabelt Element.
- Mat der selwechter Logik gëtt dat zweet Element (9), dat drëtt (79), ..., dat lescht (29) geholl.
- Element net fonnt.
- D'Sich kascht 7 Operatiounen.
Gutt Hash Funktioun
Wéi Dir gesitt, ofhÀngeg vum WÀert deen Dir sicht, sinn d'KÀschte net déiselwecht!
Wann ech elo d'Hashfunktioun modulo 1 vum Schlëssel Ànneren (dat ass, déi lescht 000 Zifferen huelen), kascht déi zweet Lookup nëmmen 000 Operatioun well et keng Elementer am Segment 6 sinn. Déi richteg Erausfuerderung ass eng gutt Hash Funktioun ze fannen déi Eemer erstellt déi eng ganz kleng Unzuel vun Elementer enthalen.
A mengem Beispill, eng gutt Hash Funktioun ze fannen ass einfach. Awer dëst ass en einfacht Beispill, eng gutt Hash Funktioun ze fannen ass méi schwéier wann de Schlëssel ass:
- String (zum Beispill - Familljennumm)
- 2 Zeilen (zum Beispill - Familljennumm a Virnumm)
- 2 Zeilen an Datum (zum Beispill - Familljennumm, Virnumm a Gebuertsdatum)
- ...
Mat enger gudder Hash-Funktioun kaschten Hash-Tabelle Lookups O(1).
Array vs Hash Dësch
Firwat net eng Array benotzen?
Hmm, gutt Fro.
- Den Hash Dësch kann sinn deelweis an d'Erënnerung gelueden, an déi reschtlech Segmenter kënnen op der Scheif bleiwen.
- Mat engem Array musst Dir kontinuéierlech Plaz an der Erënnerung benotzen. Wann Dir e groussen Dësch lued et ass ganz schwéier genuch kontinuéierlech Plaz ze fannen.
- Fir engem hash Dësch, Dir kënnt de Schlëssel wielt Dir wëllt (Zum Beispill, Land an Persoun Familljennumm).
Fir mĂ©i Informatiounen, kĂ«nnt Dir den Artikel iwwer liesen , wat eng effizient Ămsetzung vun engem Hash-Table ass; Dir musst Java net verstoen fir d'Konzepter an dĂ«sem Artikel ze verstoen.
Source: will.com
