
# Индекси

`DocStore` индексите се съхраняват до колекцията в `.storh/indexes`. Те са обикновени файлове, изведени изцяло от записите, и могат да бъдат изградени отново по всяко време. Декларирайте ги с верижен интерфейс или чрез [схема](https://storh.inline0.dev/bg/docs/schema):

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

Видове индекси:

- индекси за равенство за полета като `kind` или `status`: по един файл за всяка различна стойност, така че директното търсене чете само файла със съответната стойност
- уникални индекси за полета като `slug`: проверяват се при запис; дублирана стойност води до неуспешен `put()`, преди да бъде записано каквото и да е
- индекси за диапазон за скаларни стойности: сортиран файл с разредени контролни точки за търсене, който обслужва `gt`, `gte`, `lt`, `lte`, `between` и `prefix`

Индексите за диапазон могат също да обслужват `orderBy` по същото поле чрез `limit`, директно в реда на индекса, възходящ или низходящ, без да събират и сортират целия резултат в паметта.

Когато заявка комбинира два предиката `eq` върху неуникални полета с индекс за равенство, storh може автоматично да използва съставен сегмент за тази двойка полета. Така филтрите по две полета със селективни стойности остават бързи, без да е нужно да се декларира друг индекс.

## Съгласуваност и поправка

Записите в индексите се актуализират след атомарната подмяна на файла със записа, под заключване за запис на колекцията, така че записите и индексите се променят заедно. `verify()` сравнява всеки индекс с пълно сканиране на записите и отчита несъответствия; `reindex()` изгражда отново всички зададени индекси от файловете със записи; `repair()` поставя повредените записи под карантина и след това изгражда индексите отново.

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

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

`explain()` връща `index_scan`, когато планировчикът може да използва зададен индекс, а иначе връща `full_scan`.
