
# Indexy

`DocStore` indexy sa ukladajú vedľa kolekcie do `.storh/indexes`.
Sú to bežné súbory odvodené výlučne zo záznamov a možno ich
kedykoľvek znova vytvoriť. Deklarujte ich plynulo alebo prostredníctvom
[schémy](https://storh.inline0.dev/sk/docs/schema):

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

Typy indexov:

- indexy rovnosti pre polia ako `kind` alebo `status`: jeden súbor pre každú jedinečnú
  hodnotu, takže vyhľadávanie konkrétnej hodnoty číta iba zodpovedajúci súbor
- jedinečné indexy pre polia ako `slug`: vynucujú sa pri zápise, duplicitná
  hodnota spôsobí zlyhanie `put()` ešte pred zápisom
- rozsahové indexy pre skalárne hodnoty: zoradený súbor so riedkymi
  kontrolnými bodmi na preskakovanie, ktorý podporuje `gt`, `gte`, `lt`, `lte`, `between` a `prefix`

Rozsahové indexy dokážu na tom istom poli odpovedať aj na `orderBy` pomocou `limit`
priamo v poradí indexu, vzostupne alebo zostupne, bez materializácie a
zoradenia celého výsledku.

Keď dotaz kombinuje dva predikáty `eq` na poliach s indexom rovnosti, ktoré nie sú jedinečné,
storh môže pre túto dvojicu polí použiť automatický zložený blok. Vďaka tomu
zostávajú selektívne filtre podľa dvoch polí rýchle bez potreby deklarovať ďalší index.

## Konzistentnosť a oprava

Zápisy aktualizujú položky indexu po atómovom nahradení súboru záznamu,
pod zámkom zápisu kolekcie, takže záznamy a indexy sa menia spoločne.
`verify()` porovná každý index s úplným skenovaním záznamov a nahlási odchýlky;
`reindex()` znova vytvorí každý nakonfigurovaný index zo súborov záznamov; `repair()`
presunie poškodené záznamy do karantény a potom indexy znova vytvorí.

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

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

`explain()` vráti `index_scan`, keď plánovač môže použiť nakonfigurovaný index, a
`full_scan` v opačnom prípade.
