Indeksai
DocStore indeksai saugomi šalia kolekcijos, aplanke .storh/indexes.
Tai įprasti failai, išvesti tik iš įrašų; juos galima bet kada atkurti. Indeksus galima deklaruoti nuosekliuoju būdu arba per schemą:
$docs->indexes()
->field('slug')->unique()
->field('kind')
->field('publishedAt')->range()
->sync();
Indeksų tipai:
- lygybės indeksai laukams, tokiems kaip
kindarbastatus: po vieną failą kiekvienai unikaliai reikšmei, todėl tiesioginės paieškos metu skaitomas tik atitinkamas reikšmės failas - unikalumo indeksai laukams, tokiems kaip
slug: unikalumas užtikrinamas įrašymo metu; pasikartojanti reikšmė sukeliaput()klaidą dar prieš ką nors įrašant - intervalų indeksai skaliarinėms reikšmėms: surikiuotas failas su retais peršokimo kontroliniais taškais, palaikantis
gt,gte,lt,lte,betweenirprefix
Intervalų indeksai taip pat gali atsakyti į orderBy to paties lauko užklausas, naudodami limit, tiesiai iš indekso tvarkos – didėjimo arba mažėjimo tvarka – nesudarydami viso rezultato atmintyje ir jo nerūšiuodami.
Kai užklausa apima du eq predikatus pagal laukus, kurių lygybės indeksai nėra unikalūs, storh gali automatiškai naudoti jungtinį šių laukų poros segmentą. Taip dviejų laukų filtrai išlieka greiti ir nereikia deklaruoti papildomo indekso.
Nuoseklumas ir taisymas
Įrašai indeksų įrašus atnaujina po to, kai įrašo failas pakeičiamas atominiu būdu, kolekcijos rašymo užrakto metu, todėl įrašai ir indeksai atnaujinami kartu.
verify() palygina kiekvieną indeksą su visų įrašų peržiūra ir praneša apie neatitikimus;
reindex() atkuria visus sukonfigūruotus indeksus iš įrašų failų; repair()
izoliuoja sugadintus įrašus ir tada atkuria indeksus.
$docs->reindex();
$plan = $docs
->query()
->where('slug')->eq('home')
->explain();
explain() grąžina index_scan, kai planuoklis gali naudoti sukonfigūruotą indeksą, o kitu atveju – full_scan.