
# Indeksit

`DocStore`-indeksit tallennetaan kokoelman viereen hakemistoon `.storh/indexes`. Ne ovat tavallisia tiedostoja, jotka johdetaan kokonaan tietueista ja voidaan rakentaa uudelleen milloin tahansa. Määritä ne sujuvalla syntaksilla tai [skeeman](https://storh.inline0.dev/fi/docs/schema) avulla:

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

Indeksityypit:

- yhtäsuuruusindeksit kentille, kuten `kind` tai `status`: yksi tiedosto kutakin eri arvoa kohti, joten yksittäishaku lukee vain vastaavan arvotiedoston
- yksikäsitteisyysindeksit kentille, kuten `slug`: yksikäsitteisyys tarkistetaan kirjoitettaessa, ja kaksoisarvo aiheuttaa virheen `put()` ennen kirjoittamista
- väli-indeksit skalaarisille arvoille: lajiteltu tiedosto, jossa on harvat hakupisteet; palvelee kyselyitä `gt`, `gte`, `lt`, `lte`, `between` ja `prefix`

Alueindeksit voivat myös vastata `orderBy` saman kentän kohdalla käyttäen `limit`-indeksiä suoraan nousevassa tai laskevassa järjestyksessä ilman, että koko tulosta tarvitsee muodostaa ja lajitella.

Kun kysely yhdistää kaksi `eq`-ehtoa kenttiin, joilla on ei-yksikäsitteiset yhtäsuuruusindeksit, storh voi käyttää automaattista yhdistelmäkoria kyseiselle kenttäparille. Näin kahden kentän valikoivat suodattimet pysyvät nopeina ilman erillistä indeksimääritystä.

## Eheys ja korjaus

Kirjoitukset päivittävät indeksimerkinnät sen jälkeen, kun tietuetiedosto on korvattu atomisesti. Tämä tapahtuu kokoelman kirjoituslukon alla, joten tietueet ja indeksit päivittyvät yhdessä. `verify()` vertaa jokaista indeksiä kaikkiin tietueisiin tehtävään täyteen läpikäyntiin ja raportoi poikkeamat; `reindex()` rakentaa jokaisen määritetyn indeksin uudelleen tietuetiedostoista; `repair()` asettaa vioittuneet tietueet karanteeniin ja rakentaa sitten indeksit uudelleen.

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

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

`explain()` palauttaa arvon `index_scan`, kun kyselysuunnittelija voi käyttää määritettyä indeksiä, ja muussa tapauksessa arvon `full_scan`.
