
# Indeksy

Indeksy `DocStore` są przechowywane obok kolekcji w `.storh/indexes`.
To zwykłe pliki, wyprowadzane wyłącznie z rekordów i możliwe do odbudowania w dowolnym momencie. Można je deklarować płynnie lub w [schemacie](https://storh.inline0.dev/pl/docs/schema):

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

Typy indeksów:

- indeksy równościowe dla pól takich jak `kind` lub `status`: jeden plik dla każdej różnej wartości, dzięki czemu wyszukiwanie pojedynczej wartości odczytuje tylko pasujący plik
- indeksy unikatowe dla pól takich jak `slug`: unikatowość jest wymuszana podczas zapisu; zduplikowana wartość powoduje błąd `put()`, zanim cokolwiek zostanie zapisane
- indeksy zakresowe dla wartości skalarnych: posortowany plik z rzadkimi punktami kontrolnymi wyszukiwania, obsługujący `gt`, `gte`, `lt`, `lte`, `between` i `prefix`

Indeksy zakresowe mogą też odpowiadać na `orderBy` dla tego samego pola, używając `limit` bezpośrednio z kolejności indeksu, rosnąco lub malejąco, bez materializowania i sortowania całego wyniku.

Gdy zapytanie łączy dwa predykaty `eq` dla pól indeksowanych według równości bez wymogu unikatowości, storh może automatycznie użyć złożonego koszyka dla tej pary pól. Dzięki temu selektywne filtry dla dwóch pól działają szybko bez konieczności deklarowania kolejnego indeksu.

## Spójność i naprawa

Zapisy aktualizują wpisy indeksu po atomowej podmianie pliku rekordu, w ramach blokady zapisu kolekcji, dzięki czemu rekordy i indeksy zmieniają się razem.
`verify()` porównuje każdy indeks z pełnym skanem rekordów i zgłasza rozbieżności; `reindex()` odbudowuje każdy skonfigurowany indeks na podstawie plików rekordów; `repair()` poddaje uszkodzone rekordy kwarantannie, a następnie odbudowuje indeksy.

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

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

`explain()` zwraca `index_scan`, gdy planer może użyć skonfigurowanego indeksu, a w przeciwnym razie `full_scan`.
