Preskoči na vsebino

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:

PHP
$docs->indexes()
    ->field('slug')->unique()
    ->field('kind')
    ->field('publishedAt')->range()
    ->sync();

Vrste indeksov:

  • indeksi enakosti za polja, kot sta kind ali status: 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 napako put(), 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, between in prefix

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.

PHP
$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.