
# Indeksid

`DocStore` indeksid asuvad kogumi kõrval kataloogis `.storh/indexes`. Need on tavalised failid, mis tuletatakse täielikult kirjetest ja mida saab igal ajal uuesti luua. Määra need sujuva liidese või [skeemi](https://storh.inline0.dev/et/docs/schema) kaudu:

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

Indeksitüübid:

- võrdsusindeksid väljadele nagu `kind` või `status`: iga eri väärtuse jaoks on oma fail, nii et üksikpäring loeb ainult vastava väärtuse faili
- unikaalsusindeksid väljadele nagu `slug`: unikaalsust kontrollitakse kirjutamise ajal; korduv väärtus põhjustab `put()` tõrke enne kirjutamist
- vahemikuindeksid skalaarväärtustele: hõreda otsimisindeksiga sorteeritud fail, mis teenindab `gt`, `gte`, `lt`, `lte`, `between` ja `prefix`

Vahemikuindeksid saavad samal väljal vastata ka päringule `orderBy`, kasutades `limit` järjestust otse indeksist, kasvavalt või kahanevalt, ilma kogu tulemusi mällu laadimata ja sortimata.

Kui päring ühendab kaks `eq` tingimust mitteunikaalsetel võrdsusindekseeritud väljadel, saab storh kasutada selle väljapaari jaoks automaatset liitindeksi ämbrit. Nii jäävad kahe välja valikulised filtrid kiireks, ilma et peaksid lisaks indeksit deklareerima.

## Kooskõla ja parandamine

Kirjutamisel uuendatakse indeksikirjeid pärast kirjefaili aatomilist asendamist kogumi kirjutusluku all, nii et kirjed ja indeksid liiguvad koos. `verify()` võrdleb iga indeksit kirjete täieliku läbivaatusega ja teatab lahknevustest; `reindex()` loob kõik seadistatud indeksid kirjefailide põhjal uuesti; `repair()` paigutab rikutud kirjed karantiini ja loob seejärel indeksid uuesti.

```php
$docs->reindex();

$plan = $docs
    ->query()
    ->where('slug')->eq('home')
    ->explain();
```

`explain()` tagastab `index_scan`, kui päringuplaanur saab kasutada seadistatud indeksit, ja vastasel juhul `full_scan`.
