
# Indexy

`DocStore` se ukládají vedle kolekce v `.storh/indexes`. Jde o běžné soubory odvozené výhradně ze záznamů, které lze kdykoli znovu vytvořit. Deklarujte je plynule nebo pomocí [schématu](https://storh.inline0.dev/cs/docs/schema):

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

Typy indexů:

- indexy rovnosti pro pole jako `kind` nebo `status`: jeden soubor pro každou jedinečnou hodnotu, takže vyhledávání konkrétní hodnoty čte jen příslušný soubor
- jedinečné indexy pro pole jako `slug`: jedinečnost se vynucuje při zápisu a duplicitní hodnota vyvolá `put()` ještě před jakýmkoli zápisem
- rozsahové indexy pro skalární hodnoty: seřazený soubor s řídkými body pro přístup, který obsluhuje `gt`, `gte`, `lt`, `lte`, `between` a `prefix`

Rozsahové indexy mohou pro stejné pole také přímo z pořadí indexu zodpovídat `orderBy` s řazením `limit`, vzestupně nebo sestupně, aniž by bylo nutné načíst a seřadit celou sadu výsledků.

Když dotaz kombinuje dva predikáty `eq` nad poli s indexem rovnosti, který není jedinečný, může storh pro danou dvojici polí použít automatický složený blok. Díky tomu jsou selektivní filtry se dvěma poli rychlé, aniž by bylo třeba deklarovat další index.

## Konzistence a opravy

Zápisy aktualizují položky indexu po atomickém nahrazení souboru záznamu pod zámkem pro zápis na úrovni kolekce, takže záznamy a indexy zůstávají konzistentní. `verify()` porovnává každý index s úplným skenováním záznamů a hlásí nesoulad; `reindex()` znovu vytvoří všechny nakonfigurované indexy ze souborů záznamů; `repair()` přesune poškozené záznamy do karantény a poté indexy znovu vytvoří.

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

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

`explain()` vrací `index_scan`, pokud plánovač může použít nakonfigurovaný index, a jinak `full_scan`.
