Indeksi
Indeksi DocStore so shranjeni ob zbirki pod .storh/indexes.
To so običajne datoteke, v celoti izpeljane iz zapisov, ki jih je mogoče kadar koli znova zgraditi. Določite jih lahko z verigo metod ali prek sheme:
$docs->indexes()
->field('slug')->unique()
->field('kind')
->field('publishedAt')->range()
->sync();
Vrste indeksov:
- indeksi enakosti za polja, kot sta
kindalistatus: ena datoteka za vsako različno vrednost, zato iskanje posamezne vrednosti prebere samo ustrezno datoteko - unikatni indeksi za polja, kot je
slug: uveljavijo se ob pisanju; podvojena vrednost sproži napakoput(), preden se kar koli zapiše - indeksi razponov za skalarne vrednosti: razvrščena datoteka z redkimi kontrolnimi točkami za iskanje, ki omogoča
gt,gte,lt,lte,betweeninprefix
Indeksi razponov lahko odgovorijo tudi na orderBy za isto polje z limit neposredno iz vrstnega reda indeksa, naraščajoče ali padajoče, ne da bi bilo treba celoten rezultat prenesti v pomnilnik in razvrstiti.
Ko poizvedba združi dva predikata eq za polji, indeksirani z indeksom enakosti, ki nista unikatni, lahko storh uporabi samodejno sestavljeno vedro za ta par polj. Tako selektivna filtra z dvema poljema ostaneta hitra, ne da bi bilo treba določiti dodaten indeks.
Doslednost in popravilo
Zapisi indeksov se posodobijo po atomski zamenjavi datoteke zapisa, pod zaklepom za pisanje zbirke, zato se zapisi in indeksi posodobijo skupaj.
verify() primerja vsak indeks s celotnim pregledom zapisov in poroča o odstopanjih; reindex() znova zgradi vse nastavljene indekse iz datotek zapisov; repair() premakne poškodovane zapise v karanteno in nato znova zgradi indekse.
$docs->reindex();
$plan = $docs
->query()
->where('slug')->eq('home')
->explain();
explain() vrne index_scan, kadar lahko načrtovalnik uporabi nastavljen indeks, sicer pa full_scan.