Hogyan adatbázis indexelése működik?




Tekintettel arra, hogy `indexing`olyan fontos, mint az adathalmaz méretének növekedése, tud valaki magyarázni, hogyan működik indexelési munkát egy `database-agnostic`szinten?


További információ a lekérdezéseket index mező, nézd meg [Hogyan index egy adatbázis oszlop](https://stackoverflow.com/questions/1156/) .
**Miért van rá szükség?**


Amikor az adatot a lemezen tárolt alapú tárolóeszközök, hogy tárolja a blokk adatok. Ezek a blokkok elérni a maguk teljességében, így az atomi lemez hozzáférési művelet. Lemezblokkot szerkezete ugyanúgy, mint kapcsolt listák; mindkettő tartalmaz egy szakaszt az adatok, egy mutatót a helyét a következő csomópont (vagy blokk), és mindkét nem kell folyamatosan tárolódnak.


Tekintettel arra, hogy a rekordok száma csak akkor rendezhetők egyetlen területen, azt mondhatjuk, hogy keres egy olyan területen, amely nem igényel rendezve lineáris keresés, amely megköveteli `N/2`blokk hozzáféréseket (átlagosan), ahol `N`a blokkok száma, amelyek a táblázat ível. Ha ez a mező nem kulcs mező (azaz nem tartalmaz egyedi bejegyzés), akkor a teljes tablespace kell keresni a `N`blokk fér.


Mivel, rendezett területen, a bináris keresés alkalmazhatunk, amely `log2 N`blokk fér. Továbbá mivel az adatok rendezése kap egy nem-kulcs mező, a többi a táblázat nem kell keresni az ismétlődő értékeket, ha egy nagyobb értéket találtuk. Így a teljesítmény növelése jelentős.


**Mi indexelés?**


Az indexelés módja válogatás a rekordok száma több területen. Létrehozása index mező a tábla létrehoz egy másik adatszerkezet, amely birtokolja a mező értéke, és egy mutatót a rekord vonatkozik. Ez az index struktúra majd rendezve, így Binary keresések kell végrehajtani rajta.


A hátránya, hogy az indexelés, hogy ezek a mutatók további területet igényel a lemezen, hiszen az indexek együtt tárolja a táblát a MyISAM motor, ezt a fájlt gyorsan eléri a megengedett méretet a mögöttes fájlrendszer, ha több területen ugyanabban a táblázatban indexelése .


**Hogyan működik?**


Először is, nézzük vázlat minta adatbázis tábla séma; 



```
Mező neve Adat típus Méret lemezen
id (elsődleges kulcs) unsigned int 4 bájtot
FIRSTNAME Char (50) 50 bájt
lastName Char (50) 50 bájt
EmailAddress Char (100) 100 bájt

```

**Megjegyzés** : char helyett a varchar, hogy lehetővé tegye a pontos mérete a lemezen értéket. Ez a minta adatbázis tartalmazza ötmillió sorok és indexálás. Az előadás több lekérdezések most lehet elemezni. Ezek a lekérdezés segítségével a *id* (a rendezve kulcs mező), és egyet a *FIRSTNAME* (a nem-kulcs szétválogatás nélkül kitölteni).


***1. példa*** - *rendezve vs szelektálatlan mezők*


Mivel a minta adatbázis `r = 5,000,000`bejegyzések egy fix méretű, amely egy rekord hossza `R = 204`byte, és tárolja azokat egy táblát a MyISAM motor, amelyet az alapértelmezett blokk méretét `B = 1,024`byte. A blokkoló tényező az asztal lenne `bfr = (B/R) = 1024/204 = 5`jutó bejegyzések lemezblokk. A blokkok száma a szükséges tartani a táblázat `N = (r/bfr) = 5000000/5 = 1,000,000`blokkokat.


A lineáris keresés az id mező lenne szükség átlagosan `N/2 = 500,000`blokk fér találni egy értéket, mivel az id mező kulcsfontosságú területen. De mivel az id mező is rendezve, egy bináris keresést lehet végezni igénylő átlagosan `log2 1000000 = 19.93 = 20`blokk fér. Azonnal kiderül, hogy ez egy drasztikus javulást.


Most a *FIRSTNAME* mező nem kiválogatott sem kulcsfontosságú területén, így a bináris keresés lehetetlen, és nem azok az értékek, egyedi, és így a táblázat szükség lesz keresi a végén egy pontos `N = 1,000,000`blokk fér. Ez az a helyzet, hogy az indexelés célja, hogy javítsa.


Tekintettel arra, hogy az index rekord tartalmazza csak az indexelt mező és egy mutatót, az eredeti lemez, magától értetődik, hogy kisebb lesz, mint a multi-mező rekordot az mutat. Tehát maga az index igényel kevesebb lemez blokkok, mint az eredeti tábla, amely így kevesebbszer kell blokk hozzáférések végighaladni. A séma egy index a *FirstName* mező alábbiakban vázolt;



```
Mező neve Adat típus Méret lemezen
FIRSTNAME Char (50) 50 bájt
(Felvétel pointer) Special 4 bájt

```

**Megjegyzés** : mutatóeszközök a MySQL 2, 3, 4 vagy 5 bájt hosszúságú méretétől függően a táblázat.


***2. példa*** - *indexelés*


Mivel a minta adatbázis `r = 5,000,000`rekordok az index rekord hossza `R = 54`bájt és az alap blokk méretét `B = 1,024`byte. A blokkoló tényező az index lenne `bfr = (B/R) = 1024/54 = 18`jutó bejegyzések lemezblokk. A blokkok száma a szükséges tartani az index `N = (r/bfr) = 5000000/18 = 277,778`blokkok.


Most a keresést a *FIRSTNAME* területén tudja használni az index a teljesítmény növelése érdekében. Ez lehetővé teszi a bináris keresés az index átlagosan `log2 277778 = 18.08 = 19`blokk hozzáférések. Ahhoz, hogy megtalálja a címet a tényleges rekord, ami egy további blokk hozzáférés olvasni, így összesen `19 + 1 = 20`blokkolja a bejáratok, messze a 1.000.000 blokk hozzáfér találniuk kell egy *FIRSTNAME* mérkőzés a nem indexelt tábla.


**Mikor kell használni?**


Tekintettel arra, hogy létrehoz egy indexet igényel további lemezterület (277778 blokkok plusz a fenti példában a ~ 28% -os növekedés), és hogy túl sok indexek okozhat eredő kérdéseket fájlrendszerek mérethatárok, gondosan kell használni, hogy válassza ki a megfelelő mezők index.


Mivel indexek csak használják, hogy gyorsítsák fel a keresést a megfelelő területen belül nyilvántartást, magától értetődik, hogy mezőindexelés csak a kimenetnél lenne egyszerűen hulladék lemezterület és a feldolgozási idő, amikor egy betétet vagy törölni működését, így el kéne kerülni. Szintén jellege miatt a bináris keresés, a számossága vagy egyediségét az adatok fontosak. Az indexelés a területen egy számossága 2 osztanám az adatokat a felére, míg a számossága 1000 visszatér megközelítőleg 1000 rekordokat. Ilyen alacsony számosságú hatékonysága csökken egyenes sort, és az optimalizáló elkerülhető az index, ha a számossága kisebb, mint 30% -a rekordot, így gyakorlatilag az index egy hulladék helyet.
Pontosan! Nekem érthetetlen, hogy ennyi energiát fektetnek (folyamatosan) valamibe amivel inkább csak rosszabb lesz a felület, és a megszokott dolgok meg eltűnnek (pl. nemrég még minden lecke teljesítése után lehetett látni, hogy mennyi van a következő szintig, most meg ahhoz be kell menni az adatlapra stb.). Régebben, amikor a megjegyzések az adott feladat felett jelentek meg, akkor nekem csak 1-2 másodperc kellett ehhez, most meg, hogy új oldalt nyit (ez már jó pár hónapja így van), azóta ez baromi lassú (nálam kb. 15 mp), bár tudom, hogy a külön oldal megnyitásának is van előnye (pl. nyitva lehet hagyni). Ez utóbbit pl. lehetne orvosolni azzal, hogy mindenki személyre szólóan beállíthatná hogyan működjön neki. Mit jelent nálad a "nem tudok fejlődni"?


Nem ad pontokat? Ha megcsinálsz egy leckét, vagy ismételsz egyet, akkor ad pontokat (azt hiszem 10-et). Neked most ezt írja: angol - 15. szint| Következő szint: 1040 pont | Összpontszám: 7960 pont. | Vagyis ha megcsinálsz 104 leckét, vagy ismétlést, akkor meglesz a 16. szint. Persze, ekkor még menni kell tovább, a 25. szintig. 


Vagy sokszor beszíneződik egy tojás, ami előtte már aranyszínű volt. Ez így normális.


Vagy a százalékok "bolondultak meg"? Néhol felfele megy, néhol esetleg csökken. Ez is a rendszer (egyik) érdekessége. Ha meg akarod érteni az ilyen feladatokat, egy videót ajánlok:  

<https://www.youtube.com/watch?v=oqP_oIKNuvU> Kicsit alulspecifikált a feladat. Nem mondtad meg, hogy honnan indulunk, mit jelent "átjutni a táblán", lehet-e átlósan lépni. Ennek hiányában én úgy vettem, hogy megadható egy kiinduló és egy cél mező, és nem lehet átlósan lépni. Ez egy tipikus backtrack feladat:  

<https://en.wikipedia.org/wiki/Backtracking>  

  

Itt egy egyszerű rekurzív implementáció: <https://pastebin.com/y4RTTs1Q>  

  

Ha tényleg teljesen véletlenszerűen töltjük fel a táblát, akkor elég kicsi a valószínűsége, hogy el lehet jutni a kiindulási mezőből a célba. Ezért alul kikommentezve mellékeltem egy olyan main függvényt is, ami addig fut, amíg egy megoldható labirintust nem sikerül generálni. Szerintem így sokkal követhetőbb az egész. Amúgy lehet hogy hosszú táv után ezeket is kell frissíteni, de nem vagyok benne biztos, csak egy megjegyzés volt. :) Attól függetlenül, hogy igaz-e, mert azt én nem tudom.  

De ilyen módszerekkel lehet arra motiválni az embereket, hogy jó válaszokat adjanak és ne trollkodjanak. Ha meg akarod szerezni az ajándékot, akkor minél jobb választ kell adnod. Ezt azzal lehet a legkönnyebben elérni, hogy egy kérdésnek sokkal jobban utánajársz, hogy sokkal pontosabb választ adj.  

A másik pedig, hogy több választ adjanak az emberek. Ha meg akarod nyerni az ajándékot, akkor hogy jobban szerepelj több választ is akarsz adni, ha több válasz adnak egy kérdésre, akkor nagyobb esélye van, hogy valaki megválaszolja azt.  

  

Az oldal szempontjából mindkettő fontos. Fontos a kérdésekre adott pontos válasz, ahogy fontos, hogy több válasz legyen, hogy minél több szemszögből is meg legyen válaszolva egy kérdés. Az ellenőrzést rád bízom. Csatoltam a függvények képét.  

  

Ellenőrizni úgy tudod, hogy pár számot behelyettesítesz x helyére és leolvasod az eredményt.  

Pl az elsőnél x=4 esetén -|x-4| ez lesz -|4-4|=0 és a függvényen is látod, hogy valóban 0 az érték.  

Ha nem érted, írj! Én iphone-ról tudok nyilatkozni, de gondolom az androidos telefonok is hasonlóan működnek. Vannak olyan feladatok, ahol a fordítást előre megadott szavak közül kell kiválasztani helyes sorrendben. Azért ez nagy könnyítés, a weben ilyen nincs, ott meg kell azért dolgozni, hogy helyesen fordíts le egy mondatot, de szerintem ezáltal talán jobban is rögzül.
Ha itthon vagyok, akkor mindig a webes változatot használom, akárhol máshol lehet telefonról. Szia Irén!  

  

Ha regisztráció nélkül használja valaki a rendszert akkor nem lehet érvényesíteni a kitöltési szám limitet. Az oka az, hogy a regisztráció a felhasználó azonosítását szolgálja. Ha nem tudja a rendszer, hogy ki ül a gép előtt, akkor számolni sem tudja, hogy a személy hányadik kitöltésnél jár. Korábban csináltam egy munkalapot a mátrix-szorzáshoz:  

<https://www.geogebra.org/m/gmavHspE>  

Most, a te feladatodhoz ezt a képet:  

Érthető a megoldás menete?