
# Indeksai

`DocStore` indeksai saugomi šalia kolekcijos, aplanke `.storh/indexes`.
Tai įprasti failai, išvesti tik iš įrašų; juos galima bet kada atkurti. Indeksus galima deklaruoti nuosekliuoju būdu arba per [schemą](https://storh.inline0.dev/lt/docs/schema):

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

Indeksų tipai:

- lygybės indeksai laukams, tokiems kaip `kind` arba `status`: po vieną failą kiekvienai unikaliai reikšmei, todėl tiesioginės paieškos metu skaitomas tik atitinkamas reikšmės failas
- unikalumo indeksai laukams, tokiems kaip `slug`: unikalumas užtikrinamas įrašymo metu; pasikartojanti reikšmė sukelia `put()` klaidą dar prieš ką nors įrašant
- intervalų indeksai skaliarinėms reikšmėms: surikiuotas failas su retais peršokimo kontroliniais taškais, palaikantis `gt`, `gte`, `lt`, `lte`, `between` ir `prefix`

Intervalų indeksai taip pat gali atsakyti į `orderBy` to paties lauko užklausas, naudodami `limit`, tiesiai iš indekso tvarkos – didėjimo arba mažėjimo tvarka – nesudarydami viso rezultato atmintyje ir jo nerūšiuodami.

Kai užklausa apima du `eq` predikatus pagal laukus, kurių lygybės indeksai nėra unikalūs, storh gali automatiškai naudoti jungtinį šių laukų poros segmentą. Taip dviejų laukų filtrai išlieka greiti ir nereikia deklaruoti papildomo indekso.

## Nuoseklumas ir taisymas

Įrašai indeksų įrašus atnaujina po to, kai įrašo failas pakeičiamas atominiu būdu, kolekcijos rašymo užrakto metu, todėl įrašai ir indeksai atnaujinami kartu.
`verify()` palygina kiekvieną indeksą su visų įrašų peržiūra ir praneša apie neatitikimus;
`reindex()` atkuria visus sukonfigūruotus indeksus iš įrašų failų; `repair()`
izoliuoja sugadintus įrašus ir tada atkuria indeksus.

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

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

`explain()` grąžina `index_scan`, kai planuoklis gali naudoti sukonfigūruotą indeksą, o kitu atveju – `full_scan`.
