
# Index

`DocStore`-index lagras bredvid samlingen under `.storh/indexes`.
De är vanliga filer som helt härleds från posterna och kan byggas om
när som helst. Deklarera dem med en flytande syntax eller via ett
[schema](https://storh.inline0.dev/sv/docs/schema):

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

Indextyper:

- jämlikhetsindex för fält som `kind` eller `status`: en fil per unikt
  värde, så en punktuppslagning läser endast den matchande värdefilen
- unikhetsindex för fält som `slug`: upprätthålls vid skrivning; ett duplicerat
  värde gör att `put()` misslyckas innan något skrivs
- intervallindex för skalära värden: en sorterad fil med glesa sökkontrollpunkter,
  som hanterar `gt`, `gte`, `lt`, `lte`, `between` och `prefix`

Intervallindex kan även besvara `orderBy` på samma fält med en `limit`
direkt från indexordningen, stigande eller fallande, utan att skapa och
sortera hela resultatet i minnet.

När en fråga kombinerar två `eq`-predikat på icke-unika jämlikhetsindexerade fält,
kan storh använda en automatisk sammansatt hink för det fältparet. Detta håller
filter på två fält med få träffar snabba utan att kräva en till indexdeklaration.

## Konsekvens och reparation

Skrivningar uppdaterar indexposter efter att postfilen har bytts atomärt,
under samlingens skrivlås, så att poster och index ändras tillsammans.
`verify()` jämför varje index med en fullständig genomsökning av posterna och rapporterar avvikelser;
`reindex()` bygger om alla konfigurerade index från postfilerna; `repair()`
sätter skadade poster i karantän och bygger sedan om.

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

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

`explain()` returnerar `index_scan` när frågeplaneraren kan använda ett konfigurerat index och
`full_scan` annars.
