
# Indeksi

`DocStore` indeksi tiek glabāti blakus kolekcijai mapē `.storh/indexes`.
Tie ir parasti faili, kas pilnībā iegūti no ierakstiem un kurus var jebkurā laikā atjaunot. Deklarējiet tos plūstoši vai izmantojot [shēmu](https://storh.inline0.dev/lv/docs/schema):

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

Indeksu veidi:

- vienādības indeksi laukiem, piemēram, `kind` vai `status`: viens fails katrai atšķirīgai vērtībai, tāpēc atsevišķa meklēšana nolasa tikai atbilstošo vērtību failu
- unikālie indeksi laukiem, piemēram, `slug`: tiek nodrošināti rakstīšanas laikā; dublēta vērtība izraisa kļūdu `put()`, pirms kaut kas tiek ierakstīts
- diapazonu indeksi skalārām vērtībām: sakārtots fails ar retām meklēšanas kontrolpunktiem, kas nodrošina `gt`, `gte`, `lt`, `lte`, `between` un `prefix`

Diapazonu indeksi var arī atbildēt uz `orderBy` tai pašā laukā ar `limit` tieši no indeksu secības — augošā vai dilstošā — neveidojot un nešķirojot visu rezultātu atmiņā.

Ja vaicājumā apvienoti divi `eq` nosacījumi laukiem ar vienādības indeksu, kas nav unikāli, storh var izmantot automātisku saliktu kopu šim lauku pārim. Tādējādi atlasīti divu lauku filtri ir ātri, un nav jādeklarē vēl viens indekss.

## Saskaņotība un labošana

Ierakstu faili tiek atomiski aizstāti un pēc tam rakstīšanas slēdzenes ietvaros atjaunināti indeksu ieraksti, tāpēc ieraksti un indeksi mainās kopā.
`verify()` salīdzina katru indeksu ar visu ierakstu skenēšanu un ziņo par neatbilstībām; `reindex()` atjauno katru konfigurēto indeksu no ierakstu failiem; `repair()` ievieto bojātos ierakstus karantīnā un pēc tam atjauno indeksus.

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

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

`explain()` atgriež `index_scan`, ja vaicājumu plānotājs var izmantot konfigurētu indeksu, un `full_scan` citos gadījumos.
