Kaip veikia duomenų bazės indeksavimas?

Atsižvelgiant į tai, kad indeksavimas yra toks svarbus, kad jūsų duomenų rinkinys auga, ar kas nors gali paaiškinti, kaip indeksavimas veikia duomenų bazės agnostikos lygmenyje?

Informaciją apie laukų indeksavimo užklausas galima rasti Kaip indeksuoti duomenų bazės stulpelį .

1591 m
04 авг. Xenph Yan nustatė 04 rug . 2008-08-04 13:07 '08, 13:07 2008-08-04 13:07
@ 10 atsakymų

Kodėl tai būtina?

Kai duomenys saugomi diskų įrenginiuose, jis saugomas kaip duomenų blokai. Prieiga prie šių blokų atliekama visiškai, todėl jie yra prieinami atomų diskams. Disko blokai yra struktūrizuoti taip pat, kaip ir susieti sąrašai; abiejuose skyriuose yra duomenų sekcija, rodyklė į kito mazgo vietą (arba bloką) ir abu neturėtų būti saugomi tarpusavyje.

Atsižvelgiant į tai, kad įrašų skaičių galima surūšiuoti tik viename lauke, galime teigti, kad paieškoje lauke, kuris nėra surūšiuotas, reikia tiesinės paieškos, kuriai reikalinga N/2 blokų prieiga (vidutiniškai), kur N yra numeris blokai, kuriuose yra lentelė. Jei šis laukas yra ne raktų laukas (t.y., jame nėra unikalių įrašų), reikia ieškoti visos lentelės vietos N prieigoje prie bloko.

Binarinė paieška gali būti naudojama surūšiuotame lauke, tačiau ji turi log2 N prieigą prie blokų. Be to, kadangi duomenys yra surūšiuoti pagal ne raktų lauką, likusiai lentelės daliai nereikia ieškoti pasikartojančių verčių, kai tik randama didesnė vertė. Taigi produktyvumo padidėjimas yra didelis.

Kas yra indeksavimas?

Indeksavimas - tai būdas surinkti kelis įrašus keliuose laukuose. Indekso sukūrimas lentelėje esančiame lauke sukuria kitą duomenų struktūrą, kurioje yra lauko reikšmė, ir rodyklę prie įrašo, su kuriuo jis susijęs. Tada ši indeksų struktūra surūšiuojama, kad būtų galima atlikti dvejetainius paieškas.

Indeksavimo trūkumas yra tas, kad šiems rodikliams reikia papildomos vietos diske, nes indeksai kartu su MyISAM mechanizmu yra saugomi kartu, šis failas gali greitai pasiekti pagrindinės failų sistemos dydžių ribas, jei daugelyje toje lentelėje esančių laukų yra indeksuojami.

Kaip tai veikia?

Pirma, atkreipkime pavyzdinę duomenų bazės lentelės schemą;

 Lauko pavadinimas Duomenų tipas Dydis diske id (pirminis raktas) Nepasirašytas INT 4 baitai firstName Char (50) 50 baitų pavardė Char (50) 50 baitų emailAddress Char (100) 100 baitų

Pastaba : vietoj varchar buvo naudojamas žiedas, kad būtų užtikrintas tikslus disko dydis. Šioje bandymų duomenų bazėje yra penki milijonai eilučių ir nėra sąraše. Dabar bus analizuojama kelių užklausų atlikimas. Tai užklausa, naudojant identifikatorių (rūšiuojamo rakto lauką) ir kitą, naudojant pirmąjį pavadinimą (ne simbolių nerūšiuotas laukas).

1 pavyzdys - rūšiuojami arba nerūšiuoti laukai

Atsižvelgiant į mūsų mėginių duomenų bazę, r = 5,000,000 fiksuotų dydžių įrašų, kurių įrašo ilgis yra R = 204 baitai, ir jie saugomi lentelėje, naudojant MyISAM mechanizmą, kuris naudoja numatytąjį bloko dydį B = 1,024 baitų. Lentelės blokavimo koeficientas bus bfr = (B/R) = 1024/204 = 5 įrašai vienam diskų blokui. Bendras blokų, reikalingų lentelės saugojimui, skaičius yra N = (r/bfr) = 5000000/5 = 1,000,000 .

Jei norite gauti tiesinę paiešką „ID“ lauke, jums reikia vidurkio N/2 = 500,000 kad galėtumėte pasiekti bloką, kad rastumėte vertę, atsižvelgiant į tai, kad ID laukas yra pagrindinis laukas. Bet kadangi taip pat rūšiuojamas ID laukas, gali būti atlikta dvejetainė paieška, reikalaujanti vidutiniškai log2 1000000 = 19.93 = 20 blokuoti prieigą. Iš karto matome, kad tai yra radikalus pagerėjimas.

Dabar pirmojo vardo laukas nėra surūšiuotas, o ne raktų laukas, todėl neįmanoma atlikti dvejetainės paieškos, o vertės nėra unikalios, todėl lentelėje reikia ieškoti iki galo, kad būtų galima tiksliai pasiekti bloką N = 1,000,000 . Tokioje situacijoje indeksavimas yra skirtas koreguoti.

Atsižvelgiant į tai, kad indekso įraše yra tik indeksuotas laukas ir rodyklė į pradinį įrašą, yra pagrįsta, kad jis bus mažesnis už nurodytą daugelio laukų įrašą. Taigi indeksas reikalauja mažiau diskų blokų nei pradinė lentelė, taigi ir mažiau prieigos prie iteracijos blokų. Rodyklės pirmojo pavadinimo lauko schema yra parodyta žemiau;

 Lauko pavadinimas Duomenų tipas Dydis diske firstName Char (50) 50 baitų (įrašų rodyklė) Specialūs 4 baitai

Pastaba Rodyklės MySQL yra 2, 3, 4 arba 5 baitai, priklausomai nuo lentelės dydžio.

2 pavyzdys. Indeksavimas

Atsižvelgiant į mūsų mėginių duomenų bazę r = 5,000,000 įrašų, kurių indekso įrašo ilgis yra R = 54 baitai ir naudojant numatytąjį bloko dydį B = 1,024 baitų. Indekso blokavimo faktorius bus bfr = (B/R) = 1024/54 = 18 įrašų už diskų bloką. Bendras indeksų kaupimui reikalingų blokų skaičius yra N = (r/bfr) = 5000000/18 = 277,778 .

Dabar ieškant naudojant pirmojo pavadinimo lauką, indeksas gali būti naudojamas našumui pagerinti. Tai leidžia jums atlikti dvejetainį indeksų paiešką su vidutine prieiga prie bloko log2 277778 = 18.08 = 19 . Norėdami rasti faktinio įrašo adresą, kuriam reikia papildomos prieigos prie bloko skaitymui, iš viso pasiekus 19 + 1 = 20 blokų prieigos, toli nuo 1000 000 blokų užklausų, kurių reikia norint surasti pirmąjį pavadinimo lentelę be indeksavimo.

Kada jis turėtų būti naudojamas?

Atsižvelgiant į tai, kad norint sukurti indeksą reikia papildomos vietos diske (277 778 papildomi blokai iš aukščiau pateikto pavyzdžio, padidėjimas 28%) ir kad per daug indeksų gali sukelti problemų su failų sistemos dydžio apribojimais, turėtumėte atidžiai apsvarstyti galimybę pasirinkti tinkamus indeksavimo laukus .

Kadangi indeksai naudojami tik tam, kad pagreitintų įrašų atitinkamo lauko paiešką, aišku, kad indeksų laukai, naudojami tik išėjimui, paprasčiausiai bus disko vietos praradimas ir apdorojimo laikas įterpimo ar ištrynimo metu, todėl turėtų būti vengiama. Be to, atsižvelgiant į dvejetainio paieškos pobūdį, svarbi yra duomenų galia ar unikalumas. Indeksavimas lauke, kurio galia yra 2, duomenis padalintų per pusę, o 1000 galingumas - apie 1000 įrašų. Esant tokiai mažai galiai, efektyvumas sumažinamas iki linijinio rūšiavimo, o užklausos optimizatorius vengs naudoti indeksą, jei galia yra mažesnė nei 30% įrašo skaičiaus, todėl indeksas nereikalingas.

2477
04 авг. atsakymas pateikiamas Xenph Yan 04 rug . 2008-08-04 13:41 '08 13:41 pm 2008-08-04 13:41

Pirmą kartą perskaičius tai man buvo labai naudinga. Ačiū.

Nuo tada aš įgyjau šiek tiek įžvalgos apie indekso kūrimo trūkumą: jei rašote į lentelę ( UPDATE arba INSERT ) su vienu indeksu, jūs iš tikrųjų turite du įrašus į failų sistemą. Vienas iš jų yra lentelės duomenys, o kitas - rodyklės duomenys (ir jo naudojimas (ir, jei suskirstyti į grupes) naudojami lentelės duomenys). Jei lentelė ir indeksas yra tame pačiame standžiajame diske, užtrunka daugiau laiko. Taigi lentelė be indekso (krūvos) leis greičiau rašyti operacijas. (jei turėtumėte du indeksus, turėtumėte tris rašymo operacijas ir tt)

Tačiau dviejų skirtingų vietų nustatymas dviejuose skirtinguose indeksų ir lentelės duomenų standžiajame diske gali sumažinti / pašalinti laiko sąnaudų didinimo problemą. Tam reikia apibrėžti papildomas failų grupes su atitinkamais failais reikiamuose kietajame diske ir lentelės / indekso vietą, kaip pageidaujama.

Kita su indeksais susijusi problema yra jų susiskaidymas laikui bėgant, kai įterpiami duomenys. REORGANIZE padeda, jums reikia rašyti procedūras, kad tai atliktumėte.

border=0

Kai kuriuose scenarijuose krūva yra naudingesnė nei lentelė su indeksais,

Pavyzdžiui: - Jei turite daug konkuruojančių įrašų, bet tik vieną naktį skaitykite už pranešimo darbo laiko.

Be to, labai svarbu diferencijuoti klasterius ir nekastruotus indeksus.

Padėjo man: - Ką iš tikrųjų reiškia klasteris ir nekastruotas indeksas?

147
30 апр. atsakymas duotas „ Der U “ balandžio 30 d 2013-04-30 17:31 '13, 17:31, 2013-04-30 17:31

Indeksas yra tiesiog duomenų struktūra, kuri greičiau ieško tam tikros stulpelio duomenų bazėje. Ši struktūra paprastai yra b-medis arba maišos lentelė, tačiau ji gali būti bet kokia kita loginė struktūra.

Norėdami gauti daugiau informacijos, rekomenduoju: Kaip veikia duomenų bazės indeksai? Ir kaip padeda indeksai?

91
20 февр. hcarreras atsakymas vasario 20 d 2014-02-20 17:40 '14, 17:40 2014-02-20 17:40

Tarkime, kad norime surasti užklausą, kad surastume visą informaciją apie darbuotojus, vadinamus „Abc?

 SELECT * FROM Employee WHERE Employee_Name = 'Abc' 

Kas atsitinka be indekso?

Duomenų bazės programinė įranga pažodžiui turi pažvelgti į kiekvieną „Darbuotojų“ lentelės eilutę, kad išsiaiškintų, ar šios eilutės „Darbuotojo“ vardas yra „Abc. Kadangi mes norime kiekvienos eilutės pavadinimo„ Abc “viduje, mes negalime tiesiog nustoti ieškoti kai tik randame tik vieną eilutę su pavadinimu „Abc“, nes gali būti ir kitų eilučių su pavadinimu Abc , todėl kiekviena eilutė iki paskutinės eilutės turi būti surasta - tai reiškia, kad tūkstančiai linijų šioje scenarijoje turi būti patikrinti duomenų bazėje. rasti linijų su „ime“ "ABC", tai. Tai, kas vadinama pilna lentelė Scan

Kaip duomenų bazės indeksas gali padėti našumui

Visas indekso turinys - pagreitinti paieškos užklausas, žymiai sumažinant įrašų / eilučių skaičių, kurį reikia tirti. Indeksas - tai duomenų struktūra (dažniausiai B-medis), kurioje saugomos konkrečios stulpelio vertės lentelėje.

Kaip veikia B medžio indeksas?

Priežastys, kodėl B-medžiai yra populiariausia indeksų duomenų struktūra, yra todėl, kad jie yra efektyvūs laikui bėgant, nes paiešką, ištrynimą ir įterpimą galima atlikti logaritminiu laiku. Kita svarbi priežastis, kodėl B-medžiai dažniau naudojami, yra tai, kad B-medyje saugomi duomenys gali būti rūšiuojami. RDBMS paprastai nustato, kuri duomenų struktūra faktiškai naudojama indeksui. Tačiau kai kuriuose scenarijuose su tam tikromis DBVS galite nustatyti, kurią duomenų struktūrą norite naudoti savo duomenų bazėje, kurdami indeksą.

Kaip veikia maišos lentelės indeksas?

Priežastys, dėl kurių naudojami maišos indeksai, yra tai, kad maišos lentelės yra labai veiksmingos, kai reikia rasti tik vertes. Taigi užklausos, lyginamos su lygybe su eilute, gali gauti vertes labai greitai, jei jos naudoja maišos indeksą.

Pvz., Anksčiau aptartas užklausa gali būti naudingas naudojant „darbuotojo“ vardo stulpelyje sukurtą maišos indeksą. Būdas, kaip veikia hash indeksas, bus tai, kad stulpelio reikšmė bus raktas hash lentelėje, o faktinė vertė, susijusi su šiuo raktu, bus tiesiog rodyklė nurodytoms lentelės eilutėms. Kadangi maišos lentelė iš esmės yra asociatyvi matrica, tipiškas įrašas atrodys panašus: "Abc => 0x28939", kur 0x28939 yra nuoroda į lentelės eilutę, kurioje Abc yra saugoma atmintyje. Abc vertės nustatymas maišos lentelės indekse ir nuorodos į eilutę atmintyje grąžinimas, žinoma, yra daug greitesnis nei skenuoti lentelę, kad būtų surastos visos eilutės, kurių vertė „Abc“ darbuotojo vardo stulpelyje.

Hash indekso trūkumai

„Hash“ lentelės nerūšiuoja duomenų struktūros, ir yra daug užklausų tipų, kurių hash indeksai net negali padėti. Pavyzdžiui, tarkime, kad norite sužinoti visus darbuotojus, kurie yra jaunesni nei 40 metų. Kaip galėtumėte tai padaryti naudodami maišos indeksą? Na, tai nėra įmanoma, nes maišos lentelė yra tinkama tik raktinių verčių poroms surasti - tai reiškia užklausas, kurios tikrina lygybę

Kas tiksliai yra duomenų bazės rodyklėje? Taigi dabar jūs žinote, kad lentelės stulpelyje sukuriamas duomenų bazės indeksas ir kad indeksas išsaugo konkrečioje stulpelyje esančias vertes. Tačiau svarbu suprasti, kad duomenų bazės indeksas nenurodo vertybių kitose tos pačios lentelės skiltyse. Pavyzdžiui, jei sukuriame rodyklę „Darbuotojo_pavadinimas“ stulpelyje, tai reiškia, kad stulpelių „Darbuotojų_Age“ ir „Darbuotojų_pavadinimas“ vertės taip pat nėra saugomos indekse. Jei mes tiesiog išsaugojome visus kitus rodyklės stulpelius, tai būtų tarsi sukurti kitą lentelės kopiją, kuri užims per daug vietos ir būtų labai neefektyvi.

Kaip duomenų bazė žino, kada naudoti indeksą? Kai paleidžiate užklausą, pvz., „SELECT * FROM Employee WHERE Employee_Name = 'Abc“, duomenų bazė tikrina, ar yra stulpelio (-ų), kurio (-ių) yra prašoma, indeksas. Darant prielaidą, kad „Employee_Name“ stulpelyje yra sukurtas indeksas, duomenų bazėje reikės nuspręsti, ar iš tikrųjų yra tikslinga naudoti indeksą norimų verčių paieškai, nes yra kai kurių scenarijų, kai iš tikrųjų yra mažiau veiksminga naudoti duomenų bazės indeksą, ir efektyviau nuskaityti visas stalas.

Kas yra duomenų bazės indeksas?

Tai užima erdvę - ir kuo didesnė jūsų lentelė, tuo didesnis jūsų indeksas. Kitas našumo rodiklis su rodikliais yra tai, kad kai pridedate, ištrinate ar atnaujinate atitinkamos lentelės eilutes, tos pačios operacijos turėtų būti atliekamos su indeksu. Atminkite, kad indeksas turi apimti tuos pačius minutės duomenis kaip ir visi lentelės stulpeliai (stulpeliai), kuriuos apima indeksas.

Paprastai indeksas turėtų būti sukurtas tik lentelėje, jei indeksuotame stulpelyje pateikti duomenys bus dažnai prašomi.

Taip pat žr

62
13 авг. Somnath Muluk atsakymas, pateiktas rugpjūčio 13 d. 2016-08-13 21:36 '16 at 9:36 pm 2016-08-13 21:36

Paprastas aprašymas !!!!!!!!!!

Indeksas yra tik duomenų struktūra, kurioje vertės yra saugomos tam tikram stulpeliui lentelėje. Indeksas sukurtas lentelės stulpelyje.

Pavyzdžiui, mes turime duomenų bazės lentelę, pavadintą „User“ su trimis stulpeliais - pavadinimą, amžių ir adresą. Tarkime, kad Vartotojo lentelėje yra tūkstančiai eilučių.

Tarkime, kad norime surasti užklausą, kad surastume visą informaciją apie bet kurį vartotoją, pavadintą „John“. Jei vykdysime kitą užklausą.

 SELECT * FROM User WHERE Name = 'John' 

Duomenų bazės programinė įranga pažodžiui turėtų pažvelgti į kiekvieną naudotojo lentelės eilutę, kad pamatytų, ar šios eilutės pavadinimas yra „Jonas“. Tai užtruks daug laiko. Būtent čia indeksas padeda mums „indeksas naudojamas pagreitinti paieškos užklausas, žymiai sumažinant įrašų / eilučių skaičių, kurį reikia patikrinti“.
Kaip sukurti indeksą

 CREATE INDEX name_index ON User (Name) 

Indeksas susideda iš stulpelių reikšmių (pvz., John) iš vienos lentelės ir kad šios vertės yra saugomos duomenų struktūroje.
Taigi dabar duomenų bazėje bus naudojamas indeksas, skirtas ieškoti darbuotojų, vadinamų „John“, nes indeksas gali būti surūšiuotas pagal abėcėlę pagal pavadinimą „Vartotojai“. Ir kadangi ji yra rūšiuojama, tai reiškia, kad vardo paieška yra daug greitesnė, nes visi pavadinimai, prasidedantys „J“, bus rodomi šalia vienas kito.

25
02 авг. Atsakymas duotas programuotojuiPanda 02 rug. 2016-08-02 04:30 '16 at 4:30 2016-08-02 04:30

Klasikinis pavyzdys „Indeksas knygose“

Apsvarstykite 1000 puslapių „knygą“, suskirstytą į 100 skyrių, kiekvieną skyrių su X puslapiais.

Paprasta, taip?

Dabar be indekso puslapio, norėdami rasti tam tikrą skyrių, prasidedantį raide „S“, jūs neturite kito pasirinkimo, kaip nuskaityti visą knygą. ty: 1000 puslapių

Bet pradžioje rodomas puslapis. Ir norėdami perskaityti bet kurį konkretų skyrių, jums reikia dar kartą ir vėl peržiūrėti indekso puslapį. Suradę tinkamą indeksą, galite efektyviai pereiti į skyrių, praleidžiant kitus skyrius.

Bet tada, be 1000 puslapių, jums reikės ~ 10 puslapių, kad būtų rodomas indekso puslapis, todėl yra 1010 puslapių.

Taigi indeksas yra atskira sekcija, kurioje saugomi indeksuotų įrašų duomenys surūšiuota tvarka, kad būtų galima atlikti efektyvią paiešką.

Mokyklose tai paprasta, ar ne?: P

20
23 апр. Sankarganesh Eswaran atsakymas, pateiktas balandžio 23 d 2017-04-23 17:43 '17, 17:43 pm 2017-04-23 17:43

Tiesiog greitas pasiūlymas. Kadangi indeksavimas yra papildoma įrašo ir saugojimo vieta, todėl, jei jūsų programai reikia daugiau įterpimo / atnaujinimo operacijų, galite naudoti lenteles be indeksų, tačiau jei reikia daugiau duomenų paieškų, turėtumėte eiti į indeksuotą lentelę.

15
14 янв. atsakymas suteiktas mudasir 14 sausis 2015-01-14 09:44 '15 at 9:44 2015-01-14 09:44

Pagalvokite apie duomenų bazės indeksą kaip knygos indeksą. Jei turite knygą apie šunis ir norite sužinoti, kaip sakyti vokiečių aviganius, jūs, žinoma, galėtumėte peržiūrėti visus knygos puslapius ir rasti tai, ko ieškote, tačiau tai, žinoma, užima daug laiko ir ne labai daug greitai. Kitas variantas yra tai, kad galite tiesiog pereiti prie knygos „Indeksas“ skilties ir tada surasti tai, ko ieškote, naudodami asmens, kurio ieškote, pavadinimą (šiuo atveju, vokiečių aviganiai), taip pat ieškokite puslapio numerio, kad galėtumėte greitai rasti ko ieškote. Duomenų bazėje puslapio numeris vadinamas rodykle, kuris nukreipia duomenų bazę į adresą diske, kuriame yra objektas. Naudojant panašią analogiją su vokiečių aviganiu, galėtume turėti kažką panašaus (vokiečių aviganis, 0x77129), kur 0x77129 yra adresas, kuriame yra saugomi vokiečių aviganio duomenų linijos.

Trumpai tariant, indeksas yra duomenų struktūra, kurioje saugomos konkrečios stulpelio vertės lentelėje, kad būtų pagreitinta užklausų paieška.

9
21 дек. Atsakymą pateikė Alf Moh . 2016-12-21 20:16 '16 at 20:16 2016-12-21 20:16