Przejdź do treści

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:

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.