
# 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](https://storh.inline0.dev/sl/docs/schema):

```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`.
